illustration

使用pyecharts绘制关系图

目的

现有数据集email_dev_inside为一个月内某研发人员成员间的邮件往来记录,现要对邮件往来数据进行处理,选择合适的图表,展示公司研发部门的成员组织结构,分别找出每个群体的负责人,并分析研发部门以及每个群体中的主要工作内容

其中,数据的说明如下:

image-20201217144417640

系统环境

操作系统: Ubuntu 18.04LTS

python: 3.6.9

pyecharts: 1.8.1

IDE: pycharm

步骤

  • 首先对数据进行处理,对from的邮件和to的邮件不重复的标上号(nodedic)
  • 然后是不同主题的处理,使用seaborn对颜色进行分区,不同主题标上不同颜色(colordic)
  • 在将数据整理成graph能接收的形式,绘制图像
  • 利用visualmap增加不同颜色对应的主题(pieces)

完整代码

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
#!/usr/bin/python3
import pandas as pd
from pyecharts.charts import Graph
import pyecharts.options as opts
import seaborn as sns

data = pd.read_excel('data/email_dev_inside.xlsx')
colors = sns.color_palette().as_hex()
colors.extend(sns.color_palette('Paired').as_hex())
colors.extend(sns.hls_palette(8, l=.8, s=.5).as_hex())
colors = iter(colors)
subjectCount = data['subject'].value_counts()
colordic = {i: next(colors) for i in subjectCount.index if subjectCount[i] > 500}
colordic['其它'] = next(colors)
nodedic = {}
links = []
linksdic = {i: [] for i in colordic.keys()}
j = 0
for i in range(len(data)):
s = data['from'][i]
t = data['to'][i]
c = data['subject'][i]
if s not in nodedic.keys():
nodedic[s] = j
j += 1
if t not in nodedic.keys():
nodedic[t] = j
j += 1
if c not in colordic.keys():
c = '其它'
links.append(
opts.GraphLink(source=nodedic[s], target=nodedic[t], linestyle_opts=opts.LineStyleOpts(color=colordic[c])))
pieces = [{'max': int(subjectCount[i]), 'label': i, 'color': colordic[i]} for i in colordic.keys()
if i != '其它']
pieces.append({'max': 1, 'label': '其它', 'color': colordic['其它']})
graph = Graph(
init_opts=opts.InitOpts(width="1400px", height="800px")
).add("邮件往来关系图",
nodes=map(
lambda x: {'name': x},
nodedic.values()),
links=links,
).set_global_opts(
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=pieces
)
)
graph.render('result/email.html')

效果

email.html

结果分析

从结果很容易看出,该公司分成了三大部分,分别由248、174、173来负责,由1负责的小部分,概要设计、需求调研等较多,可以初步判定174的部分是软件的开发阶段,设计并开发程序.由29、30的小部分红色的需求较多,可能248负责的是需求分析部分,而最后的173则是测试部分

吐槽

pyecharts居然完全不支持对线的分类,通过linestyle可以标上颜色,但无法设置鼠标悬浮时的标签,最后的legend是用visualmap强行加上的,也没有以往的点击后显示/隐藏的效果.

关于线的颜色的设置,我的代码里是拿不同主题的seaborn color palette拼接,因为超过一定数量(好像是9个)就会自动循环(有重复),但效果并不好,我也试过用#FFFFFF平均分成25个颜色但效果也不好.需要数量比较多的区分度高的颜色还是一件听困难的事儿,只能想办法自己判断可能是同一个阶段的标签在合并一起然后去划分

这个关系图只是个半成品,想要完整的搞出来将会很费劲,以后有时间再搞吧