Networkx в Python - нарисуйте атрибуты узла как метки вне узла
у меня есть график узлов с определенными атрибутами, и я хочу нарисовать график networkx в Python с несколькими атрибутами в качестве меток узлов вне узла.
может кто-нибудь помочь мне, как я могу написать свой код для достижения этой цели?
в моем коде есть цикл, который генерирует " interface?"атрибут для каждого входа из списка брандмауэра (fwList)
for y in fwList:
g.add_node(n, type='Firewall')
print 'Firewall ' + str(n) + ' :'
for x in fwList[n]:
g.node[n]['interface_'+str(i)] = x
print 'Interface '+str(i)+' = '+g.node[n]['interface_'+str(i)]
i+=1
i=1
n+=1
затем, позже я рисую узлы и ребра, такие как:
pos=nx.spring_layout(g)
nx.draw_networkx_edges(g, pos)
nx.draw_networkx_nodes(g,pos,nodelist=[1,2,3],node_shape='d',node_color='red')
и будет продлен это к некоторым новым узлам с другой формой и цветом позже.
для маркировки одного атрибута я попытался ниже кода, но это не сработало
labels=dict((n,d['interface_1']) for n,d in g.nodes(data=True))
и для вывода текста из узла я понятия не имею...
2 ответов
у вас есть доступ к позициям узлов в словаре 'pos'. Таким образом, вы можете использовать matplotlib для размещения текста, где вам нравится. например,
In [1]: import networkx as nx
In [2]: G=nx.path_graph(3)
In [3]: pos=nx.spring_layout(G)
In [4]: nx.draw(G,pos)
In [5]: x,y=pos[1]
In [6]: import matplotlib.pyplot as plt
In [7]: plt.text(x,y+0.1,s='some text', bbox=dict(facecolor='red', alpha=0.5),horizontalalignment='center')
Out[7]: <matplotlib.text.Text at 0x4f1e490>
в дополнение к ответу Арика,pos
словарь содержит x, y
координаты в ценностях. Таким образом, вы можете манипулировать им, например:
pos_higher = {}
y_off = 1 # offset on the y axis
for k, v in pos.items():
pos_higher[k] = (v[0], v[1]+y_off)
затем нарисуйте метки с новой позицией:
nx.draw_networkx_labels(G, pos_higher, labels)
здесь G
ваш объект graph и labels
список строк.