(Python) Networkx - Определить собственный словарь pos - PullRequest
0 голосов
/ 25 октября 2018

мой код такой:

for x in xrange(5):
    G.add_edge('sIP:\n'+mostfrequent[x][0], countermfi[x])
    G.add_edge('dIP:\n'+mostfrequent[x][1], countermfi[x])
    G.add_edge('sPort:\n'+mostfrequent[x][2], countermfi[x])
    G.add_edge('dPort:\n'+mostfrequent[x][3], countermfi[x])
    G.add_edge('Protocol:\n'+mostfrequent[x][4], countermfi[x])
    G.add_edge('Packets:\n'+mostfrequent[x][5], countermfi[x])
    G.add_edge('Bytes:\n'+mostfrequent[x][6], countermfi[x])


pos = nx.kamada_kawai_layout(G)  # positions for all nodes

#Hyperedges
nx.draw_networkx_nodes(G, pos, nodelist=countermfi, node_size=node_size, node_color='red', node_shape='s', alpha=1)             

#Nodes          
nx.draw_networkx_nodes(G, pos, nodelist=flattened_list_nodes, node_size=1600, node_color='blue', alpha=0.6)             

#Edges
nx.draw_networkx_edges(G, pos, edgelist=G.edges(), width=2)

#Labels
nx.draw_networkx_labels(G, pos, font_size=11, font_family='sans-serif')
plt.axis('off')
plt.show()

Мой вывод print G.nodes (data = True):

[('Bytes:\n620', {}), ('dIP:\n178.237.19.228', {}), ('sPort:\n2049', {}), ('sPort:\n60179', {}), ('sIP:\n16.37.97.29', {}), (153, {}), ('dPort:\n443', {}), ('dPort:\n80', {}), ('Packets:\n2', {}), ('Packets:\n1', {}), ('sPort:\n44492', {}), ('Bytes:\n100', {}), ('sIP:\n16.37.93.196', {}), ('dIP:\n178.237.17.97', {}), (188, {}), ('dIP:\n16.37.157.74', {}), ('sIP:\n16.37.97.222', {}), ('dIP:\n178.237.17.61', {}), ('sIP:\n16.37.97.17', {}), ('Bytes:\n46', {}), (224, {}), (227, {}), ('dPort:\n691', {}), ('dIP:\n104.131.44.62', {}), ('sPort:\n55177', {}), ('Protocol:\n6', {}), (120, {}), ('sPort:\n56326', {})]

У меня проблема с использованием nx.kamada_kawai_layout, потому что я получаю сообщение об ошибке:

raise nx.NetworkXError('Node %s has no position.' % e)
networkx.exception.NetworkXError: Node '16.37.97.17' has no position.

Как я могу это исправить или установить свой собственный pos для каждого из 40 узлов?

Заранее спасибо, Привет:)

1 Ответ

0 голосов
/ 26 октября 2018

Исходя из вашего другого вопроса , ваша проблема в том, что узел '16.37.97.17', который появляется в flattened_list_nodes, является , а не узлом на графике.Когда вы добавили ребра, вы добавили имя узла с некоторым текстом.Итак, вы добавили узел 'sIP:\n16.37.97.17'

Затем вы просите networkx построить узел '16.37.97.17', но это не является частью графика, и из-за этого у pos нет позиции дляЭто.Так что это потерпит неудачу.Вам нужно либо не изменять имя узла перед добавлением его в график, либо использовать измененное имя в вашем nodelist.

Даже если вы определите позицию для этого узла, он все равно не сможетграфик, потому что узел не на графике.

...