Я предлагаю решение с небольшим изменением того, что вы просили. Если вы расположите уровни по вертикали, а люди на уровне ролей - по горизонтали, на одном уровне будет много людей, поэтому ярлыки сталкиваются друг с другом. Вместо этого я рисую уровни ролей по горизонтали, а индивидуумы на уровне располагаются вертикально, оставляя достаточно места для просмотра ярлыков.
Я не думаю, что есть встроенная функция макета, которая делает то, что вы просите. Тем не менее, это не очень сложно сделать свой собственный макет. Важной частью этого является назначение координат 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)
Я думаю, что это дает вам хорошую отправную точку. Вы можете настроить размещение здесь.