NetworkX 根据价值放置节点

NetworkX place nodes based on value

我是 networkX 的新手,我正在尝试找到一种方法,以便我可以根据代表 Y 轴上的值的值来定位节点,而无需更改使树看起来不错的节点的随机 X 值

使用这些节点:

import networkx as nx
import matplotlib.pyplot as plt

G=nx.Graph()
G.add_node(430, value = 1)
G.add_node(230, value = -1)
G.add_node(220, value = 0)
G.add_node(210, value = -1)
G.add_node(10, value = 1)
G.add_edge(430,220)
G.add_edge(10,220)
G.add_edge(210,220)
G.add_edge(230,220)
nx.draw_networkx(G)
plt.show()

结果应该是一个 "X",每次我 运行 代码

时,所有 5 个节点都在这些特定的 3 个 y 值上

我不确定这个想法是否适合你,但你应该可以通过以下方式实现:

  • 手动调用布局算法
  • 修改位置
  • 修改位置的绘图

这是一个例子:

import networkx as nx
import matplotlib.pyplot as plt

G=nx.Graph()
G.add_node(430, value = 1)
G.add_node(230, value = -1)
G.add_node(220, value = 0)
G.add_node(210, value = -1)
G.add_node(10, value = 1)
G.add_edge(430,220)
G.add_edge(10,220)
G.add_edge(210,220)
G.add_edge(230,220)

pos=nx.spring_layout(G)  # default layout like in your code

other_y = nx.get_node_attributes(G, 'value')
for node, node_pos in pos.items():
    if node in other_y.keys():
        pos_ = pos[node]
        pos_[1] = other_y[node]
        pos[node] = pos_

f, arr = plt.subplots(2)
nx.draw_networkx(G, ax=arr[0])
arr[0].set_title('default layout')

nx.draw_networkx(G, pos=pos, ax=arr[1])
arr[1].set_title('partially y-modified')

plt.show()

输出(警告:可能针对 python 3 进行调整):