Networkx和graphviz布局将节点放在同一个地方

时间:2015-10-01 05:45:55

标签: python matplotlib graph networkx

我使用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()

This is what displays with the code above

我发现的行为似乎是在__str__方法中返回的行为。 如果我将__str__方法更改为起始唯一的方法,则按预期排列:

def __str__(self):
    return self.value 

enter image description here

无法判断这是否是预期的行为,或者我做错了什么,或者这是一个错误。 建议赞赏! :)

1 个答案:

答案 0 :(得分:1)

虽然我目前无法找到权威的参考资料,但现在发生了什么:

Graphviz对节点名称中可出现的字符有一些限制。它无法处理的字符是:。因此,当所有内容都传递给graphviz时,我相信它将其解释为一个名称只有val的单个节点(我可能错了)。

然后当networkx从graphviz获得位置时,它导致所有节点被放在同一个地方。

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