我有一个包含员工及其职务的数据集,并且为每个职位分配了一个代码:0用于高级管理人员,1用于中级管理人员,2用于一般人员。现在,我想使用层次图来绘制这些角色,以便所有代码0人员位于顶部,中间1个,底部2个。我已经在iGraph中找到了执行此操作的布局(请参见下文),但是不知道如何控制哪些节点出现在哪里。我缺少控制该参数的参数吗?任何帮助将不胜感激。
CSV: https://github.com/Laurie-Bamber/Enron_Corpus/blob/master/15Below_60Employees_1.csv
角色代码: https://github.com/Laurie-Bamber/Enron_Corpus/blob/master/Dict_role_code.csv
GML: https://github.com/Laurie-Bamber/Enron_Corpus/blob/master/15Below_60Employees_1.gml
P.S。边缘指员工之间的电子邮件,而不是等级度量。
Code:
G = Graph.Read_GML('Test.gml')
visual_style['layout'] = G.layout_reingold_tilford()
plot(G, **visual_style)
答案 0 :(得分:3)
我正在提出一种解决方案,对您的要求稍作修改。如果垂直绘制级别,而人员则是角色级别,那么同一层上会有很多人,因此标签会相互衔接。取而代之的是,我在水平方向上绘制角色级别,而在某个级别上的个人则垂直分布,从而留出了足够的空间查看标签。
我认为没有预先构建的布局功能可以满足您的要求。但是,制作自己的布局不是很困难。这样做的重要部分是在希望绘制节点的位置分配x-y坐标。之后,您只需使用Layout
函数即可将坐标转换为布局对象。
我分配x-y坐标的方案是x坐标为角色级别(1、2或3)。我将通过使角色级别的每个节点比该级别的上一个节点高一个来分配y坐标。我使用一本小词典来跟踪每个级别的下一个高度。
我将使用您提供的文件的文件名,并假定这些文件位于当前工作目录中。
import csv
from igraph import *
## Load graph
G = Graph.Read_GML('15Below_60Employees_1.gml')
## Load role levels
reader = csv.reader(open('Dict_role_code.csv'))
dx = dict(reader)
## Create a layout
height = { '1':0, '2':0, '3':0 }
COORD = []
for L in G.vs['label']:
height[dx[L]] = height[dx[L]] + 1
COORD.append((float(dx[L]), height[dx[L]]))
LO = Layout(COORD)
## Create the style
visual_style = {}
visual_style['vertex_size'] = 8
visual_style['vertex_frame_color'] = 'orange'
visual_style['layout'] = LO
visual_style['margin'] = 60
visual_style['edge_color'] = '#00000044'
plot(G, **visual_style)
我认为这为您提供了一个良好的起点。您可以从此处调整展示位置。