原文towardsdatascience.com/probably-the-best-data-visualisation-for-showing-many-to-many-proportion-in-python-40bdd24365d5https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/418d682afff47161768043287f3174c0.png在我之前的一篇文章中我介绍了一个名为PyCirclize的 Python 库。它可以帮助我们用很少的努力生成非常漂亮的 Circos 图表或者如果你喜欢和弦图。如果你想了解它如何使数据可视化更加“圆润”请不要错过。让你的 Python 数据可视化图表更加“圆润”然而如果你只对带有链接的和弦图感兴趣请不要担心。这篇文章将确保你理解如何绘制这种类型的图表。在这篇文章中我将介绍另一种类型的和弦图这是PyCirclize可以实现的。这是一种带有链接的和弦图可以很好地可视化多对多实体之间的比例关系到目前为止它是所有已知典型图表类型中最好的一个。在我们开始之前请确保使用pip按以下方式安装库。然后我们就一切准备就绪了。让我们一起来探索这个有趣的图表吧pip install pycirclize1. 快速入门https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fd22447c4914b9495d109c7a691fe716.png图片由 BRRT 来自 Pixabay 提供如同往常让我们从一个抽象但易于理解的概念开始。目的是向您展示图表的样子以及绘制它的基本方法。让我将完整的代码和图表放在开头。frompycirclizeimportCircos sectors{A:100,B:200,C:150}sector_colors{A:red,B:blue,C:green}circosCircos(sectors,space5)forsectorincircos.sectors:tracksector.add_track((95,100))track.axis(fcsector_colors[sector.name])track.text(Sector sector.name,colorwhite,size12)track.xticks_by_interval(10)circos.link((A,0,20),(B,50,70))circos.link((A,20,40),(C,30,50))circos.link((B,80,100),(A,40,60))circos.link((C,100,120),(B,150,170))figcircos.plotfig()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2681c69a1c154061923952e1163f3eb1.png现在让我们看看代码。当然无论何时我们使用第三方库我们都需要导入它。对于PyCirclize我们需要导入它的Circos模块。我们将使用这个类来定义这个图表的组件。frompycirclizeimportCircos然后正如我们想要展示一些实体之间的链接和关联我们需要将这些实体定义为“领域”。我们之所以称其为领域是因为它们将成为完整圆的一部分。在这里我还定义了另一个字典因为在图表中我们想要为这些领域显示不同的颜色。sectors{A:100,B:200,C:150}sector_colors{A:red,B:blue,C:green}然后我们将从Circos类创建 Circos 图表对象如下所示。circosCircos(sectors,space5)类工厂方法简单地接受我们为区域创建的字典以及space。space表示区域之间的间隔。你可能注意到区域大小的总和不是 360这是因为库会为我们进行必要的归一化。我们不需要担心这一点只需简单地放入我们原始数据集中的数字。然后让我们循环区域将每个区域渲染为图上的轨迹。forsectorincircos.sectors:tracksector.add_track((95,100))track.axis(fcsector_colors[sector.name])track.text(Sector sector.name,colorwhite,size12)track.xticks_by_interval(10)add_track()将添加具有归一化长度的区域。元组(95, 100)可以被认为是区域厚度的起始和结束位置。考虑到圆的起点是 0那么区域从 95 开始到 100 结束。因此位置距离起点 95 像素厚度为 100。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/db7a381d85909f676b76f966aa9981db.png然后axis()函数告诉轨迹渲染区域轴。颜色将来自我们预定义的字典。因此这确保了我们的 3 个区域有不同的颜色。这是确保我们可以区分区域的重要一点。接下来我们在轴内添加文本。文本基于颜色字典中的名称生成。然后我们想要为每 10 个单位添加刻度。在定义了轴之后我们还需要定义链接。在这种情况下我们非常手动地如下定义链接。circos.link((A,0,20),(B,50,70))circos.link((A,20,40),(C,30,50))circos.link((B,80,100),(A,40,60))circos.link((C,100,120),(B,150,170))第一个元组定义了起始/结束位置的原区域。因此对于第一行它将在区域 A 的轴上为 0–20。第二个元组定义了目标区域和位置。在第一行这将在区域 B 的轴上介于 50–70 之间。其他链接也是如此。最终就像matplotlib有plt.show()函数来显示图表一样PyCirclize也有以下行来确保图表被渲染并显示。figcircos.plotfig()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/01882458e3fcdb298e9d4966d0a0593d.png上面是手动生成带有链接的弦图的步骤。在实践中我们可能将数据存储在 Pandas DataFrame 中。在下一节中我将模拟一个真实世界的例子来展示一个更实用的用例。2. 真实世界示例 - 总保险价值图https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8a762d81ceadd80560cdb72f2f0719dd.png图片由PublicDomainPictures来自Pixabay现在让我们看看一个真实世界的例子。假设我们是一家保险公司的数据分析师。我们想要生成一个花哨的图表来展示不同城市客户的总保险价值以及不同保险类型的保险比例。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/91bb70cbe62270a632c25f16bbe4336a.png上面的表格显示了城市中客户为某些资产投保的数百万美元。现在让我们看看如何将其转换成一个精美的图表。由于我们想要模拟数据在 Pandas Dataframe 中的场景让我们也导入 Pandas 库。frompycirclizeimportCircosimportpandasaspd现在让我们初始化数据并将它们放入一个 Dataframe 中。数据正好来自之前的表格。# Initialise the datarow_names[Sydney,Melbourne,Brisbane]col_names[Property,Life,Automobile]data[[100,150,200],[80,120,160],[60,90,130],]# Create a pandas dataframedfpd.DataFrame(data,indexrow_names,columnscol_names)现在让我们使用库中的initialize_from_matrix()方法即时生成可视化。# Define the Circos Diagram with linkscircosCircos.initialize_from_matrix(df,space5,# Space between sectorsticks_interval50,# Ticks every 50r_lim(93,100),# Radius limits for sectorscmaptab10,# Use a built-in color map to get better looking colour codelabel_kwsdict(r94,size12,colorwhite),# Font of the sector labelslink_kwsdict(ecblack,lw0.5),# Style of the links)在上面的代码中我们使用df作为数据扇区之间的空间是 5 像素然后为每 50 个添加刻度。r_lim()与快速入门示例中做的是完全相同的事情即决定扇区标题的位置和厚度。然后我们可以使用颜色图确保扇区和链接可以轻松区分。最后定义扇区标签文本和链接样式。在完成所有配置后别忘了用以下代码行绘制它。figcircos.plotfig()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c408ed6c065b5cb66d5897e1c28764b6.png这里是完整的代码片段供您方便使用。frompycirclizeimportCircosimportpandasaspd# Initialise the datarow_names[Sydney,Melbourne,Brisbane]col_names[Property,Life,Automobile]data[[100,150,200],[80,120,160],[60,90,130],]# Create a pandas dataframedfpd.DataFrame(data,indexrow_names,columnscol_names)# Define the Circos Diagram with linkscircosCircos.initialize_from_matrix(df,space5,# Space between sectorsticks_interval50,# Ticks every 50r_lim(93,100),# Radius limits for sectorscmaptab10,# Use a built-in color map to get better looking colour codelabel_kwsdict(r94,size12,colorwhite),# Font of the sector labelslink_kwsdict(ecblack,lw0.5),# Style of the links)figcircos.plotfig()那真是太好了然而我们可以做得更好。也就是说链接不是有方向的。我们左边有所有的保险类型右边有所有的城市。如果我们能定义带有方向的链接图表将更容易阅读。在PyCirclize中实际上非常简单。我们只需要在链接样式配置中添加direction1。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/de08b0e568dd6b3896f7912921e4af9e.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b8d739eabeb04f5d0f99bc1af912e58c.png完整代码片段如下。frompycirclizeimportCircosimportpandasaspd# Initialise the datarow_names[Sydney,Melbourne,Brisbane]col_names[Property,Life,Automobile]data[[100,150,200],[80,120,160],[60,90,130],]# Create a pandas dataframedfpd.DataFrame(data,indexrow_names,columnscol_names)# Define the Circos Diagram with linkscircosCircos.initialize_from_matrix(df,space5,# Space between sectorsticks_interval50,# Ticks every 50r_lim(93,100),# Radius limits for sectorscmaptab10,# Use a built-in color map to get better looking colour codelabel_kwsdict(r94,size12,colorwhite),# Font of the sector labelslink_kwsdict(direction1,ecblack,lw0.5),# Style of the links)figcircos.plotfig()摘要https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ef68520d8db2e1f52b3972246721a87c.png图片由Steven Liao在Pixabay提供在这篇文章中我介绍了一种数据可视化图表类型——带链接的弦图。它是展示多个实体之间比例和相关性关系最好的图表类型之一特别是对于“多对多”关系。对于下一个我将继续挖掘PyCirclize库中的更多令人惊叹的实用功能使我们的 Python 生成数据可视化更加完善。除非另有说明所有图片均为作者所有