【问题标题】:Networkx - Problem with drawing nodes with nodelistNetworkx - 使用节点列表绘制节点的问题
【发布时间】:2019-03-29 00:57:47
【问题描述】:

我有一个这样的嵌套元组:

mostfrequent = (('16.37.97.17', '178.237.19.228', '55177', '443', '6', '1', '46'), ('16.37.97.17', '178.237.17.97', '44492', '443', '6', '1', '46'), ('16.37.97.29', '178.237.17.61', '56326', '443', '6', '1', '46'), ('16.37.97.222', '104.131.44.62', '60179', '80', '6', '2', '620'), ('16.37.93.196', '16.37.157.74', '2049', '691', '6', '1', '100'))

我想用通过 nodelist 声明的 networkx 来绘制每个子元组的每个元素:

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

为此,我将元组 A 展平为一个列表(每个元素只出现一次):

flattened_list_nodes = ['16.37.97.17', '178.237.19.228', '55177', '443', '6', '1', '46', '178.237.17.97', '44492', '16.37.97.29', '178.237.17.61', '56326', '16.37.97.222', '104.131.44.62', '60179', '80', '2', '620', '16.37.93.196', '16.37.157.74', '2049', '691', '100']

虽然当我运行它时,我得到了错误:

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

我该如何解决这个问题?

我的完整代码:

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()

提前谢谢你, 问候:)

【问题讨论】:

  • 你是如何定义pos的?它需要是一个字典,并且需要为所有节点分配一个位置。 networkx 的命令将为您创建pos
  • 我已经这样定义了 pos:pos = nx.kamada_kawai_layout(G)。如果我使用nx.draw_networkx_nodes(G, pos, node_size=3000, node_color='deepskyblue', alpha=1) 来绘制节点它可以工作,但我想用 2 个数组作为节点列表绘制 2 种不同样式的节点。将另一个数组设置为 nodelist 很奇怪。
  • 您可以编辑您的问题以提供更多代码吗?您所描述的内容向我表明该错误在其他地方。
  • 基本上错误消息是说pos没有'16.37.97.17'的值
  • 好的,更新了我的问题以提供更多我的代码。希望这有助于获得解决方案。也可以用字典定义我自己的 40 个节点的“位置”吗?如果是,我怎么知道哪个节点有哪个数字来定义它们的位置?

标签: python nodes draw networkx nodelist


【解决方案1】:

IIUC:

首先创建图,G:

G = nx.Graph()

G.add_nodes_from(flattened_list_nodes)

pos = nx.kamada_kawai_layout(G)

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

输出:

【讨论】:

  • 这在技术上是可行的,但是在单独添加节点时我的整个图表都搞砸了。我用for x in xrange(5): G.add_edge(mostfrequent[x][0], countermfi[x]) G.add_edge(mostfrequent[x][1], countermfi[x])
猜你喜欢
  • 2011-04-28
  • 2012-01-12
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2023-02-09
  • 1970-01-01
相关资源
最近更新 更多