在matplotlib中绘制时,Python networkx图形显得混乱

时间:2014-07-31 20:06:04

标签: python graph matplotlib networkx

我正在测试如何在" networkx&#34 ;;我的问题是,当我尝试使用" matplotlib"绘制这些图形时,节点,边缘和标签出现混乱。我想将标签附加到右侧节点,我希望边缘看起来像是连接节点。

import networkx as nx
try:
    import matplotlib.pyplot as plt
except:
    raise

g = nx.MultiGraph()

strList = ["rick james", "will smith", "steve miller", "rackem willie", "little tunechi", "ben franklin"]
strList2 = ["jules caesar", "atticus finch", "al capone", "abe lincoln", "walt white", "doc seuss"]
i = 0
while i < len(strList) :
    g.add_edge(strList[i], strList2[i])
    i = i + 1    

nx.draw_networkx_nodes(g,pos = nx.spring_layout(g), nodelist = g.nodes())
nx.draw_networkx_edges(g,pos = nx.spring_layout(g), edgelist = g.edges())
nx.draw_networkx_labels(g,pos=nx.spring_layout(g))
#plt.savefig("testImage.png")
plt.show()

图像

[1] http://imgur.com/PIvEm3y

我希望我的联系是这样的:

rick james <--> jules caesar
will smith <--> atticus finch
steve miller <--> al capone
...etc

非常感谢任何帮助/见解!

2 个答案:

答案 0 :(得分:1)

Matplotlib在绘制可读图方面非常糟糕。我建议你使用Graphviz,它支持NetworkX开箱即用,它让你用点格式切换更多设置。

答案 1 :(得分:1)

弹簧布局是随机的(随机的)。您遇到的一个问题来自于您在不同的时间运行此随机过程 - 为节点,边和标签生成不同的布局。试试这个,你可以在一次计算布局:

pos = nx.spring_layout(g)
nx.draw_networkx_nodes(g, pos=pos, nodelist = g.nodes())
nx.draw_networkx_edges(g, pos=pos, edgelist = g.edges())
nx.draw_networkx_labels(g, pos=pos)

或者,如果您不需要设置单个节点/边/标签的样式:

nx.draw_spring(g)

我不会声称这会给你一个“好”的布局,因为它没有(至少在我的机器上):

spring-layout

也许networkx.draw_circular布局更合适:

nx.draw_circular(g)

circular-layout

您可以阅读所有NetworkX布局here,包括Graphviz(由@ThomasHobohm建议)。