Python - иерархия узлов печати с использованием iGraph - PullRequest
0 голосов
/ 03 июля 2018

У меня есть набор данных с сотрудниками и их рабочими ролями, и каждой рабочей роли назначается код: 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. Края относятся к электронным письмам между сотрудниками, а не к показателям иерархии.

enter image description here

Code:
G = Graph.Read_GML('Test.gml')
visual_style['layout'] = G.layout_reingold_tilford()
plot(G, **visual_style)

1 Ответ

0 голосов
/ 20 июля 2018

Я предлагаю решение с небольшим изменением того, что вы просили. Если вы расположите уровни по вертикали, а люди на уровне ролей - по горизонтали, на одном уровне будет много людей, поэтому ярлыки сталкиваются друг с другом. Вместо этого я рисую уровни ролей по горизонтали, а индивидуумы на уровне располагаются вертикально, оставляя достаточно места для просмотра ярлыков.

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

Enron

Я думаю, что это дает вам хорошую отправную точку. Вы можете настроить размещение здесь.

...