原文:
towardsdatascience.com/probably-***-best-data-visualisation-for-showing-many-to-many-proportion-in-python-40bdd24365d5
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/418d682afff47161768043287f3174c0.png
在我之前的一篇文章中,我介绍了一个名为PyCirclize的
Python
图表(或者如果你喜欢,和弦图)。
如果你想了解它如何使数据可视化更加“圆润”,请不要错过。
让你的
Python
数据可视化图表更加“圆润”
然而,如果你只对带有链接的和弦图感兴趣,请不要担心。
这篇文章将确保你理解如何绘制这种类型的图表。
在这篇文章中,我将介绍另一种类型的和弦图,这是PyCirclize可以实现的。
这是一种带有链接的和弦图,可以很好地可视化多对多实体之间的比例关系,到目前为止,它是所有已知典型图表类型中最好的一个。
在我们开始之前,请确保使用pip按以下方式安装库。
然后,我们就一切准备就绪了。
让我们一起来探索这个有趣的图表吧!
pip可以被认为是区域厚度的起始和结束位置。install
快速入门
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fd22447c4914b9495d109c7a691fe716.png
图片由
BRRT
提供
如同往常,让我们从一个抽象但易于理解的概念开始。
目的是向您展示图表的样子以及绘制它的基本方法。
让我将完整的代码和图表放在开头。
frompycirclizeimportCircossectors={"A":100,"B":200,"C":150}sector_colors={"A":"red","B":"blue","C":"green"}circos=Circos(sectors,space=5)forsectorincircos.sectors:track=sector.add_track((95,100))track.axis(fc=sector_colors[sector.name])track.text("Sector
"+sector.name,color="white",size=12)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))fig=circos.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
图表对象,如下所示。
circos=Circos(sectors,space=5)类工厂方法简单地接受我们为区域创建的字典以及
space。
space表示区域之间的间隔。你可能注意到区域大小的总和不是
360,这是因为库会为我们进行必要的归一化。
我们不需要担心这一点,只需简单地放入我们原始数据集中的数字。
然后,让我们循环区域,将每个区域渲染为图上的轨迹。
forsectorincircos.sectors:track=sector.add_track((95,100))track.axis(fc=sector_colors[sector.name])track.text("Sector"
+sector.name,color="white",size=12)track.xticks_by_interval(10)
add_track()将添加具有归一化长度的区域。元组
(95,100)
考虑到圆的起点是
0,那么区域从
100。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/db7a381d85909f676b76f966aa9981db.png
然后,
axis()函数告诉轨迹渲染区域轴。颜色将来自我们预定义的字典。
因此,这确保了我们的
个区域有不同的颜色。
这是确保我们可以区分区域的重要一点。
接下来,我们在轴内添加文本。
文本基于颜色字典中的名称生成。
然后,我们想要为每
个单位添加刻度。
在定义了轴之后,我们还需要定义链接。
在这种情况下,我们非常手动地如下定义链接。
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))第一个元组定义了起始/结束位置的原区域。
因此,对于第一行,它将在区域
0–20。
第二个元组定义了目标区域和位置。
在第一行,这将在区域
50–70
之间。
其他链接也是如此。
最终,就像
matplotlib有plt.show()函数来显示图表一样,PyCirclize也有以下行来确保图表被渲染并显示。fig=circos.plotfig()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/01882458e3fcdb298e9d4966d0a0593d.png
上面是手动生成带有链接的弦图的步骤。
在实践中,我们可能将数据存储在
Pandas
中。
在下一节中,我将模拟一个真实世界的例子来展示一个更实用的用例。
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
库。
frompycirclizeimportCircosimportpandasaspd现在,让我们初始化数据并将它们放入一个
Dataframe
中。
数据正好来自之前的表格。
#Initialise
data
row_names=["Sydney","Melbourne","Brisbane"]col_names=["Property","Life","Automobile"]data=[[100,150,200],[80,120,160],[60,90,130],]#Create
dataframe
df=pd.DataFrame(data,index=row_names,columns=col_names)现在,让我们使用库中的
initialize_from_matrix()方法即时生成可视化。#Define
links
circos=Circos.initialize_from_matrix(df,space=5,#Space
sectors
ticks_interval=50,#Ticks
50
r_lim=(93,100),#Radius
sectors
cmap="tab10",#Use
code
label_kws=dict(r=94,size=12,color="white"),#Font
labels
link_kws=dict(ec="black",lw=0.5),#Style
links
)在上面的代码中,我们使用
df作为数据,扇区之间的空间是像素,然后为每
个添加刻度。
r_lim()与快速入门示例中做的是完全相同的事情,即决定扇区标题的位置和厚度。然后,我们可以使用颜色图确保扇区和链接可以轻松区分。
最后,定义扇区标签文本和链接样式。
在完成所有配置后,别忘了用以下代码行绘制它。
fig=circos.plotfig()https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c408ed6c065b5cb66d5897e1c28764b6.png
这里是完整的代码片段,供您方便使用。
frompycirclizeimportCircosimportpandasaspd#Initialise
data
row_names=["Sydney","Melbourne","Brisbane"]col_names=["Property","Life","Automobile"]data=[[100,150,200],[80,120,160],[60,90,130],]#Create
dataframe
df=pd.DataFrame(data,index=row_names,columns=col_names)#Define
links
circos=Circos.initialize_from_matrix(df,space=5,#Space
sectors
ticks_interval=50,#Ticks
50
r_lim=(93,100),#Radius
sectors
cmap="tab10",#Use
code
label_kws=dict(r=94,size=12,color="white"),#Font
labels
link_kws=dict(ec="black",lw=0.5),#Style
links
)fig=circos.plotfig()那真是太好了!然而,我们可以做得更好。
也就是说,链接不是有方向的。
我们左边有所有的保险类型,右边有所有的城市。
如果我们能定义带有方向的链接,图表将更容易阅读。
在
PyCirclize中实际上非常简单。我们只需要在链接样式配置中添加
direction=1。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
data
row_names=["Sydney","Melbourne","Brisbane"]col_names=["Property","Life","Automobile"]data=[[100,150,200],[80,120,160],[60,90,130],]#Create
dataframe
df=pd.DataFrame(data,index=row_names,columns=col_names)#Define
links
circos=Circos.initialize_from_matrix(df,space=5,#Space
sectors
ticks_interval=50,#Ticks
50
r_lim=(93,100),#Radius
sectors
cmap="tab10",#Use
code
label_kws=dict(r=94,size=12,color="white"),#Font
labels
link_kws=dict(direction=1,ec="black",lw=0.5),#Style
links
)fig=circos.plotfig()摘要
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ef68520d8db2e1f52b3972246721a87c.png
图片由Steven
Liao在Pixabay提供
在这篇文章中,我介绍了一种数据可视化图表类型——带链接的弦图。
它是展示多个实体之间比例和相关性关系最好的图表类型之一,特别是对于“多对多”关系。
对于下一个,我将继续挖掘
PyCirclize库中的更多令人惊叹的实用功能,使我们的Python
生成数据可视化更加完善。
除非另有说明,所有图片均为作者所有


