Python - 使用 iGraph 绘制节点层次结构
Python - Plot Node Hierarchy using iGraph
我有一个包含员工及其工作角色的数据集,每个工作角色都分配了一个代码:0 代表 top-management,1 代表 middle-management,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)
我提出的解决方案是对您的要求稍作修改。如果您垂直绘制级别,水平绘制角色级别的人员,则一个级别上有很多人,因此标签 运行 相互重叠。相反,我在水平方向上绘制角色级别,一个级别上的个人垂直分布,留出足够的空间来查看标签。
我认为没有预建的布局功能可以满足您的要求。但是,制作自己的布局并不是很难。这样做的关键部分是在要绘制节点的位置分配 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)
我认为这为您提供了一个良好的起点。您可以从此处调整位置。
我有一个包含员工及其工作角色的数据集,每个工作角色都分配了一个代码:0 代表 top-management,1 代表 middle-management,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)
我提出的解决方案是对您的要求稍作修改。如果您垂直绘制级别,水平绘制角色级别的人员,则一个级别上有很多人,因此标签 运行 相互重叠。相反,我在水平方向上绘制角色级别,一个级别上的个人垂直分布,留出足够的空间来查看标签。
我认为没有预建的布局功能可以满足您的要求。但是,制作自己的布局并不是很难。这样做的关键部分是在要绘制节点的位置分配 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)
我认为这为您提供了一个良好的起点。您可以从此处调整位置。