在Python中绘制自定义图表
我想画出这样的东西:
我找到的最接近这个的东西是 NetworkX 的边缘颜色图:
http://networkx.github.io/documentation/latest/examples/drawing/edge_colormap.html
这里是源代码:
#!/usr/bin/env python
"""
Draw a graph with matplotlib, color edges.
You must have matplotlib>=87.7 for this to work.
"""
__author__ = """Aric Hagberg (hagberg@lanl.gov)"""
try:
import matplotlib.pyplot as plt
except:
raise
import networkx as nx
G=nx.star_graph(20)
pos=nx.spring_layout(G)
colors=range(20)
nx.draw(G,pos,node_color='#A0CBE2',edge_color=colors,width=4,edge_cmap=plt.cm.Blues,with_labels=False)
plt.savefig("edge_colormap.png") # save as png
plt.show() # display
我在玩他们的源代码时,我搞不清楚怎么固定边缘圆圈离中心的距离。现在的距离是随机的。
还有,怎么给边缘圆圈标记和显示它们离中心的距离呢?
我知道位置是通过 pos=nx.spring_layout(G)
来确定的。所以我查看了 spring_layout 属性,发现位置可以通过一个叫 pos 的变量来指定,这个变量是一个字典,节点是键,值是一个列表。(https://networkx.github.io/documentation/latest/reference/generated/networkx.drawing/layout.spring_layout.html)
但是即使我这样做,结果还是随机的边缘:
ap = {'uniwide':[55,34,1],'eduram':[34],'uniwide_webauth':[20,55,39],'uniwide_guest':[55,34],'tele9751_lab':[100],'HomeSDN':[100],'TP-LINK':[39]}
pos=nx.spring_layout(G,pos=ap)
2 个回答
1
我尽量提供最有帮助的建议。我建议不要让它们保持静态状态。你会想要添加和删除一些东西,而算法自动放置的功能是你不想失去的。根据文档,你可能需要调整一下k的值。看起来n
是20
,所以可以把k乘以一个系数来增加距离。
n = 20
nx.spring_layout(G, k=(1.0/pow(n, .5))) # what it currently is
可能应该是这样:
nx.spring_layout(G, k=(1.0/pow(n, .5))*1.5) # play around with this factor
3
你可以通过一个叫做 pos
的字典来明确设置节点的位置。举个例子:
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_edge('center',1)
G.add_edge('center',2)
G.add_edge('center',3)
G.add_edge('center',4)
pos = {'center':(0,0),
1:(1,0),
2:(0,1),
3:(-1,0),
4:(0,-1)
}
nx.draw(G, pos=pos, with_labels=True)
plt.show()