Чтобы сгенерировать график, вы можете установить строки как пути ориентированного графа. Простым способом может быть определение pandas фрейма данных и стек для удаления пропущенных значений:
import networkx as nx
from networkx.drawing.nx_agraph import graphviz_layout
from pylab import rcParams
import pandas as pd
#df = pd.read_csv....
paths = df.loc[:,'BUILDING':].stack().groupby(level=0).agg(list).values.tolist()
# [['home', 'kitchen', 'fridge'], ['office', 'desk'], ['office', 'reception'],...
Обратите внимание, что стек полезен здесь, поскольку он игнорирует NaN, тогда мы можем просто gorupby
в индексе и агрегировать в виде списков. Затем создайте направленный граф и установите пути с помощью nx.add_path
:
G = nx.DiGraph()
for path in paths:
nx.add_path(G, path)
Теперь для визуализации графа в виде в виде дерева макет, мы могли бы использовать graphviz_layout
, который в основном является оберткой для pygraphviz_layout
:
rcParams['figure.figsize'] = 14, 10
pos=graphviz_layout(G, prog='dot')
nx.draw(G, pos=pos,
node_color='lightgreen',
node_size=1500,
with_labels=True,
arrows=True)
Если вы хотите добавить общий узел source для всех зданий, вы можете вставить столбец с именем ALL
сразу после ID
:
df.insert(1, 'ALL', 'ALL')
paths = df.loc[:,'ALL':].stack().groupby(level=0).agg(list).values.tolist()
И затем сделать то же, что и выше, где вы сейчас получите:
Обратите внимание, что есть несколько других программ верстки graphviz, которые могут напоминать больше того, что вы имеете в виду. Например, circo
:
pos=graphviz_layout(G, prog='circo')
nx.draw(G, pos=pos,
node_color='lightgreen',
node_size=1500,
with_labels=True,
arrows=True)