Python———pyecharts可交互弦图可视化
Apache ECharts是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而Python是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts诞生了。
弦图也是可视化网络关系常用的一种可视化方法,在pyecharts库中可以通过Graph()可视化弦图(网络图)。下面的程序中使用《三国演义》人物关系网络数据,首先读取数据并进行简单的预处理,读取的数据包含节点数据表格和边连接数据表格,为了使用pyecharts库进数据可视化,需要将边数据中对应的节点名称映射为整数数字,对应的处理方式和输出结果如下:
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
## 导入需要的库
import numpy as np
import pandas as pd
import os
import json
from pyecharts import options as opts
from pyecharts.charts import Graph
In[1]:## 网络图数据准备,读取节点数据表格和边数据表格
nodedf = pd.read_csv("data/chap5/TK_nodedf.csv")
edgedf = pd.read_csv("data/chap5/TK_edagedf.csv")
print(nodedf.head())
print(edgedf.head())
Out[1]: name group freq size
0 曹操 曹魏 945 14
1 曹洪 曹魏 93 9
2 程普 孙吴 74 9
3 程昱 曹魏 44 8
4 典韦 曹魏 45 8
from to cor
0 曹操 荀彧 0.431089
1 曹操 荀攸 0.488132
2 荀彧 荀攸 0.366668
3 曹操 张辽 0.442993
4 曹操 徐晃 0.389152
In[2]:## 将边的相关名称映射为数字
usemap=pd.Series(index=nodedf["name"].values,data=nodedf.index).to_dict()
edgedf["from"] = edgedf["from"].map(usemap)
edgedf["to"] = edgedf["to"].map(usemap)
print(edgedf.head())
Out[2]: from to cor
0 0 40 0.431089
1 0 39 0.488132
2 40 39 0.366668
3 0 45 0.442993
4 0 38 0.389152
为了能够使用pyecharts库中的Graph()可视化弦图,需要对数据进行进一步的处理,将节点数据和边连接数据均处理为列表的形式,其中在节点数据中,列表中的每个元素由一个字典构成,其中字典中有该节点的一些基础信息,例如:该数据集处理后的节点数据中,要包含每个节点的以下信息:"id"(节点的编号)、"name"(节点的名称)、"symbolSize"(节点可视化时使用的形状大小)、"category"(节点所属的分组)。针对节点间的边连接数据列表,其中的每个元素同样使用字典的形式,并且要包含以下的信息:"id"(边的编号)、"source"(边的起点所对应的节点编号,其对应着节点列表中的"id")、"target"(边的终点所对应的节点编号,其对应着节点列表中的"id")。针对每个节点的分组,同样定义一个分组列表categories,其中包含4种分组。数据预处理好后,每个列表的前几行输出如下所示:
In[3]:## 生成可视化时需要的节点、边和分组数据
nodes = [{"id":str(ii),
"name":nodedf.name[ii],
"symbolSize":str(2*nodedf["size"][ii]),
"value":str(nodedf.freq[ii]),
"category":nodedf["group"][ii]} for ii in nodedf.index.values]
print(nodes[0:3])
links = [{"id":str(ii),"source":str(edgedf["from"][ii]),
"target":str(edgedf.to[ii])} for ii in edgedf.index.values]
print(links[0:3])
categories = [{"name": ii} for ii in np.unique(nodedf.group)]
print(categories[0:5])
Out[3]:[{'id': '0', 'name': '曹操', 'symbolSize': '28', 'value': '945', 'category': '曹魏'}, {'id': '1', 'name': '曹洪', 'symbolSize': '18', 'value': '93', 'category': '曹魏'}, {'id': '2', 'name': '程普', 'symbolSize': '18', 'value': '74', 'category': '孙吴'}]
[{'id': '0', 'source': '0', 'target': '40'}, {'id': '1', 'source': '0', 'target': '39'}, {'id': '2', 'source': '40', 'target': '39'}]
[{'name': '孙吴'}, {'name': '曹魏'}, {'name': '群雄'}, {'name': '蜀汉'}]
可视化需要的数据准备好后,下面的程序则是利用Graph()可视化弦图,并且对图像的可视化效果通过set_global_opts()进行设置,运行程序后可获得如图1所示的可视化图像。该图像是可交互的图像,可以通过交互查看更多的信息。
In[4]:## 可视化人物关系弦图
c = (Graph(init_opts=opts.InitOpts(width="1000px", height="600px"))
.add("", nodes, links, categories,layout="circular",
is_rotate_label=True,
linestyle_opts=opts.LineStyleOpts(curve=0.3,width = 2,
color="source"),
label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(
title="《三国演义》人物关系", pos_left="10%"),
legend_opts=opts.LegendOpts(orient="vertical",
pos_left="10%",pos_top="20%"),
)
)
c.render_notebook()

图1 可交互人物关系弦图
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)