我正在测试如何在" 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()
我希望我的联系是这样的:
rick james <--> jules caesar
will smith <--> atticus finch
steve miller <--> al capone
...etc
非常感谢任何帮助/见解!
答案 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)
我不会声称这会给你一个“好”的布局,因为它没有(至少在我的机器上):
也许networkx.draw_circular
布局更合适:
nx.draw_circular(g)
您可以阅读所有NetworkX布局here,包括Graphviz(由@ThomasHobohm建议)。