Networkx中边的颜色条
我正在尝试为networkx图中的边添加一个颜色条。这里有一段代码:
import networkx as nx
import matplotlib.colors as colors
import matplotlib.cm as cmx
n = 12 # Number of clusters
w = 21 # Number of weeks
m = Basemap(
projection='merc',
ellps = 'WGS84',
llcrnrlon=-98.5,
llcrnrlat=25,
urcrnrlon=-60,
urcrnrlat=50,
lat_ts=0,
resolution='i',
suppress_ticks=True)
mx, my = m(list(ccentroids['lon']), list(ccentroids['lat']))
# The NetworkX part
# put map projection coordinates in pos dictionary
G = nx.DiGraph()
G.add_nodes_from(range(n))
for i in range(n):
for j in range(n):
if P_opt[i,j] > 0.5 and i != j:
G.add_edge(i,j, weight = P_opt[i,j])
pos = {i : (mx[i], my[i]) for i in range(n)}
# Add a color_map for the edges
jet = cm = plt.get_cmap('jet')
cNorm = colors.Normalize(vmin=0, vmax=np.max(P_opt))
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)
colorList = []
weights_list = []
for i in G.edges():
a, b = i
colorVal = scalarMap.to_rgba(G.edge[a][b]['weight'])
colorList.append(colorVal)
weights_list.append(G.edge[a][b]['weight'])
plt.clf()
fig = plt.figure()
ax = fig.add_subplot(111, axisbg='w', frame_on=False)
fig.set_size_inches(18.5, 10.5)
# draw the network
nodes = nx.draw_networkx_nodes(G, pos, node_size=100, node_color=q[:,t], cmap = plt.cm.jet,
font_size=8, with_labels=False, label='Cluster centroids')
edges = nx.draw_networkx_edges(G, pos, edge_color=colorList)
m.drawcountries()
m.bluemarble()
运行后我得到了下面的图片:

现在我想为这些边添加一个颜色条。我尝试做了类似这样的事情:
plt.sci(edges)
edges.set_array(np.array(weights_list))
plt.colorbar(shrink = 0.8)
结果我得到了这样的图片:

但是箭头和边的颜色似乎不一样。我该怎么修正这个问题呢?谢谢。
编辑:我尝试通过修改边的代码来使用以下代码:
edges = nx.draw_networkx_edges(G, pos, edge_color=colorList, edge_cmap = plt.cm.jet)
plt.colorbar(edges)
但是我遇到了一个错误 TypeError: You must first set_array for mappable
我把边的颜色改成了权重列表,得到了下面的图片:
2 个回答
1
我知道这个问题已经有点老了,但我花了一些时间搞明白了,也许对某些人来说还是有用的。
nx.draw_networkx_edges
如果没有箭头,就会返回
matplotlib.collection.LineCollection
如果有箭头,就会返回
list of matplotlib.patches.FancyArrowPatch
你可以查看这个链接了解更多信息:文档
在我的具体情况下,只有把箭头设置为False,我才能像Aric的回答那样得到一个颜色条:
edges = nx.draw_networkx_edges(G, edge_color=colors, arrows=False)
plt.colorbar(edges)
8
看起来你正在为节点设置颜色图和颜色条。下面是如何为边的颜色设置颜色图并绘制颜色条的方法:
![import networkx as nx
import matplotlib.pyplot as plt
G = nx.star_graph(20)
pos = nx.spring_layout(G)
colors = range(20)
nodes = nx.draw_networkx_nodes(G,pos,node_color='k', with_labels=False)
edges = nx.draw_networkx_edges(G,pos,edge_color=colors,width=4,
edge_cmap=plt.cm.Blues)
plt.colorbar(edges)
plt.axis('off')