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 取回位置时,导致所有节点都放在同一个位置。

所以最简单的选择是删除冒号。