我使用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__方法更改为起始唯一的方法,则按预期排列:
def __str__(self):
return self.value
无法判断这是否是预期的行为,或者我做错了什么,或者这是一个错误。 建议赞赏! :)
答案 0 :(得分:1)
虽然我目前无法找到权威的参考资料,但现在发生了什么:
Graphviz对节点名称中可出现的字符有一些限制。它无法处理的字符是:
。因此,当所有内容都传递给graphviz时,我相信它将其解释为一个名称只有val
的单个节点(我可能错了)。
然后当networkx从graphviz获得位置时,它导致所有节点被放在同一个地方。
所以你最简单的选择就是删除冒号。