Networkx в Python - нарисуйте атрибуты node как метки вне node

У меня есть график узлов с определенными атрибутами, и я хочу нарисовать график через networkx в Python с несколькими атрибутами как метки узлов вне node.

Может ли кто-нибудь помочь мне, как я могу написать свой код для достижения этой цели?

В моем коде есть цикл, который генерирует "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))

И для вывода текста из node я понятия не имею...

Ответ 1

У вас есть доступ к позициям node в словаре "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>

enter image description here

Ответ 2

В дополнение к ответу Aric, словарь 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 - ваш объект графа и labels список строк.