Networkx 和 graphviz 布局将节点放置在同一位置
Networkx and graphviz layout placing nodes in same place
我正在使用 networkx 库来处理图形并使用 matplotlib 进行可视化。
我遇到的问题是节点相互重叠。
我正在为节点使用我自己的 类 - 此处显示的简化的可运行版本:
import matplotlib
matplotlib.use('TKAgg')
import matplotlib.pyplot as plt
import networkx as nx
class MyCustomNode(object):
def __init__(self, value):
self.value = value
def __str__(self):
return "val: " + self.value
graph = nx.Graph()
graph.add_edge(MyCustomNode('a'), MyCustomNode('b'))
labels = {}
for node in graph.nodes():
labels[node] = str(node)
pos = nx.graphviz_layout(graph)
nx.draw(graph, pos, node_color='red', node_size=3000)
nx.draw_networkx_labels(graph, pos, labels, font_size=8, font_color='white')
plt.show()
我发现该行为似乎与 __str__ 方法中返回的内容相同。
如果我将 __str__ 方法更改为 starting 是唯一的,它会按预期布局:
def __str__(self):
return self.value
无法判断这是预期的行为,还是我做错了什么,或者这是一个错误。
建议赞赏! :)
虽然暂时找不到权威的参考资料,但情况是这样的:
Graphviz 对节点名称中可以出现的字符有一些限制。它无法处理的字符中有 :
。因此,当所有内容都传递给 graphviz 时,我相信它会将其解释为名称仅为 val
(我可能错了)的单个节点。
然后,当 networkx 从 graphviz 取回位置时,导致所有节点都放在同一个位置。
所以最简单的选择是删除冒号。
我正在使用 networkx 库来处理图形并使用 matplotlib 进行可视化。
我遇到的问题是节点相互重叠。 我正在为节点使用我自己的 类 - 此处显示的简化的可运行版本:
import matplotlib
matplotlib.use('TKAgg')
import matplotlib.pyplot as plt
import networkx as nx
class MyCustomNode(object):
def __init__(self, value):
self.value = value
def __str__(self):
return "val: " + self.value
graph = nx.Graph()
graph.add_edge(MyCustomNode('a'), MyCustomNode('b'))
labels = {}
for node in graph.nodes():
labels[node] = str(node)
pos = nx.graphviz_layout(graph)
nx.draw(graph, pos, node_color='red', node_size=3000)
nx.draw_networkx_labels(graph, pos, labels, font_size=8, font_color='white')
plt.show()
我发现该行为似乎与 __str__ 方法中返回的内容相同。 如果我将 __str__ 方法更改为 starting 是唯一的,它会按预期布局:
def __str__(self):
return self.value
无法判断这是预期的行为,还是我做错了什么,或者这是一个错误。 建议赞赏! :)
虽然暂时找不到权威的参考资料,但情况是这样的:
Graphviz 对节点名称中可以出现的字符有一些限制。它无法处理的字符中有 :
。因此,当所有内容都传递给 graphviz 时,我相信它会将其解释为名称仅为 val
(我可能错了)的单个节点。
然后,当 networkx 从 graphviz 取回位置时,导致所有节点都放在同一个位置。
所以最简单的选择是删除冒号。