Pyecharts-关系图

关系图

先用转专业数据练习一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import pandas as pd
import os
from pyecharts.charts import Graph
from pyecharts import options as opts

df: pd.DataFrame = pd.read_excel(r'山西大学2021年本科生转专业情况.xlsx')
node_list = [
{'name': '建筑电气与智能化', 'symbolSize': 29, 'category': '其他情况'},
{'name': '能源与动力工程', 'symbolSize': 22, 'category': '成绩优秀'},
{'name': '环境科学与工程类', 'symbolSize': 15, 'category': '成绩优秀'},
{'name': '建筑环境与能源应用工程', 'symbolSize': 16, 'category': '成绩优秀'},
{'name': '机械电子工程', 'symbolSize': 10, 'category': '成绩优秀'},
{'name': '生物科学类', 'symbolSize': 10, 'category': '成绩优秀'},
{'name': '工商管理类', 'symbolSize': 8, 'category': '成绩优秀'},
{'name': '化学类', 'symbolSize': 8, 'category': '成绩优秀'},
{'name': '电气工程及其自动化', 'symbolSize': 48, 'category': '成绩优秀'},
{'name': '计算机科学与技术', 'symbolSize': 15, 'category': '成绩优秀'},
{'name': '电子信息工程', 'symbolSize': 11, 'category': '成绩优秀'},
{'name': '数据科学与大数据技术', 'symbolSize': 8, 'category': '成绩优秀'},
{'name': '经济学类', 'symbolSize': 8, 'category': '成绩优秀'}
]

df1: pd.DataFrame = df[['转出专业', '转入专业']]
df1 = df1.drop_duplicates()
df1.columns = ['source', 'target']
link_list = []
for i in range(len(df1)):
dict = {'source': df1.iloc[i, 0],
'target': df1.iloc[i, 1]}
link_list.append(dict)
# print(link_list)

categories = [
{"name": '成绩优秀'},
{"name": '其他情况'},
]

G = (Graph()
.add(series_name="悲惨世界人物关系图",
nodes=node_list,
links=link_list,
categories=categories,
layout="circular",
is_rotate_label=True,
linestyle_opts=opts.LineStyleOpts(color="source", curve=0.3, opacity=0.7))
.set_global_opts(title_opts=opts.TitleOpts(title="悲惨世界人物关系图"),
legend_opts=opts.LegendOpts(orient="vertical", pos_left="2%", pos_top="20%"))
)
G.render("graph.html")
os.system("graph.html")

导入包

1
2
3
4
import os
import json
from pyecharts.charts import Graph
from pyecharts import options as opts

准备数据

这里我们使用“悲惨世界”人物关系的数据,数据来源:https://echarts.apache.org/examples/data/asset/data/les-miserables.json

这是一个json数据,我们先把它拷贝在本地同一文件夹下。

读取

1
2
3
4
with open(r'D:\Pycharm\myproject\Pyecharts\关系图\les-miserables.json', "r") as f:
data = json.load(f)

print(data)

这里with open()函数是用来读取文件的。我们一般读取文件时要先f.open(),在判断打开是否成功,成功则继续读取,否则显示错误提示。读完后我们还需f.close()。为了简化代码,python使用这个函数可以大大简化代码长度,简洁明了。

open()中第一个参数是路径,我们一般复制过来的路径是右斜杠,采用r""可以直接使用,不使用r则需要把右斜杠转为左斜杠。“r”代表只读。

数据处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
nodes = []
idDict = dict()
for node in data["nodes"]:
nodes.append(
{
"x": node["x"],
"y": node["y"],
"name": node["name"],
"symbolSize": node["symbolSize"],
"category": node["category"]
}
)
idDict[node["id"]] = node["name"]

link = [
{
"source": idDict[i["source"]],
"target": idDict[i["target"]]
}
for i in data["links"]
]

categories = [
{
"name": i["name"]
}
for i in data["categories"]
]

把json数据里的三类数据(点、连线、类别)分别读取到nodes、link、categories里。

开始画图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
G = (Graph(init_opts=opts.InitOpts(width="900px", height="900px"))
.add(series_name="悲惨世界人物关系图",
nodes=nodes,
links=link,
categories=categories,
layout="circular",
is_rotate_label=True,
linestyle_opts=opts.LineStyleOpts(color="source", curve=0.3, opacity=0.7))
.set_global_opts(title_opts=opts.TitleOpts(title="悲惨世界人物关系图"),
legend_opts=opts.LegendOpts(orient="vertical", pos_left="2%", pos_top="20%"))
)

# G.render("graph.html")
# os.system("graph.html")

make_snapshot(snapshot, G.render("graph.html"), "graph.png") # 渲染图片

后来又摸索出一种方法

我准备了excel数据,这里我使用了这个网站(JSON转Excel - UU在线工具 (uutool.cn))把json数据保存为excel数据,因为我们一般准备的数据是excel数据,导入后使用to_json()把dataframe转为json数据,之后再做处理。

1
2
3
4
5
data = pd.read_excel(r"node.xlsx")
nodes = eval(data.to_json(orient="records", force_ascii=False))
print(nodes)
data1 = pd.read_excel(r"link.xlsx")
link = eval(data1.to_json(orient="records", force_ascii=False))

这里to_json()函数里orient参数详见https://blog.csdn.net/qq_41780234/article/details/84990551

注意这里转换完的json数据是字符串格式,需要eval()函数去掉两边的引号,转为list格式。

1
2
3
4
5
6
7
8
9
10
links = [
{
"source": nodes[i["source"]]["name"],
"target": nodes[i["target"]]["name"]
}
for i in link
]
# print(links)
categories = [{"name": "A"}, {"name": "B"}, {"name": "C"}, {"name": "D"}, {"name": "E"},
{"name": "F"}, {"name": "G"}, {"name": "H"}, {"name": "I"}]

这是对link数据的处理。

接下来画图的代码就和上面一样啦!

大功告成!

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2022-2023 发现美的眼睛
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信