NetworkX 中加权边的颜色错误
Wrong colors for weighted edges in NetworkX
在处理以下问题太久之后,我决定在这里放一个 post。
我正在尝试设置一个 networkx 图并根据一些权重为边缘着色。问题是,边缘和颜色之间似乎存在错误分配。
这是一个简单的代码片段。
#! /usr/bin/python
# -*- coding: latin-1 -*-
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.colors as colors
# Set Up Data
G=nx.Graph()
G.add_node(0,pos=(0,0),label='0')
G.add_node(1,pos=(0,1),label='1')
G.add_node(2,pos=(1,0),label='2')
G.add_node(3,pos=(1,1),label='3')
G.add_edge(1,2, weight=3)
G.add_edge(0,2, weight=5)
G.add_edge(1,3, weight=2)
G.add_edge(2,3, weight=1)
G.add_edge(0,1, weight=4)
# Attributes
pos = nx.get_node_attributes(G,'pos')
weights = nx.get_edge_attributes(G,'weight')
labels = nx.get_node_attributes(G,'label')
# Plot Figure
fig = plt.figure()
# Nodes
nx.draw_networkx_nodes(G,pos)
nx.draw_networkx_labels(G,pos,labels)
# Edges
out = nx.draw_networkx_edges(G,pos,edge_color = weights.values(), edge_cmap = plt.cm.jet, vmin = 0.0, vmax = max(weights.values()))
nx.draw_networkx_edge_labels(G,pos,edge_labels=weights)
plt.axis('off')
# Set Up Colorbar
cbar = plt.colorbar(out)
# Show
plt.show()
从这里我得到了一个从边缘到颜色的非常奇怪的分配。谁能解释一下?我是不是做错了什么?
最终,我通过对颜色进行排序找到了解决方法。
# Store edges
sorted_edge = []
sorted_edge.append((1,2))
sorted_edge.append((0,2))
sorted_edge.append((1,3))
sorted_edge.append((2,3))
sorted_edge.append((0,1))
# Sort edges
sorted_edge = sorted(sorted_edge)
# Sort colors
new_colors = []
sorted_indices = [sorted_edge.index(edge) for edge in weights.keys()]
for index in sorted_indices:
while len(new_colors) < index+1:
new_colors.append(0)
new_colors[index] = weights.values()[sorted_indices.index(index)]
首先,我认为这不是问题的预期解决方案?!其次,我正在对这个小例子进行更大的应用,其中分配完全失败,即使使用这种排序也是如此。因此,我想我最好退后一步,试着了解问题所在。
感谢您的回答。
最好的,乔纳斯
我试过你的代码片段,我可以重现这个问题。
这可以正常工作:
edges, colors = zip(*nx.get_edge_attributes(G,'weight').items())
nx.draw(G, pos, edgelist=edges, edge_color=colors, width=10, edge_cmap = plt.cm.jet, vmin = 0.0, vmax = max(weights.values()))
我的猜测是 draw_edges 没有保持 get_edge_attributes 定义的边顺序,但我不确定...
之前:
之后:
在处理以下问题太久之后,我决定在这里放一个 post。
我正在尝试设置一个 networkx 图并根据一些权重为边缘着色。问题是,边缘和颜色之间似乎存在错误分配。
这是一个简单的代码片段。
#! /usr/bin/python
# -*- coding: latin-1 -*-
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.colors as colors
# Set Up Data
G=nx.Graph()
G.add_node(0,pos=(0,0),label='0')
G.add_node(1,pos=(0,1),label='1')
G.add_node(2,pos=(1,0),label='2')
G.add_node(3,pos=(1,1),label='3')
G.add_edge(1,2, weight=3)
G.add_edge(0,2, weight=5)
G.add_edge(1,3, weight=2)
G.add_edge(2,3, weight=1)
G.add_edge(0,1, weight=4)
# Attributes
pos = nx.get_node_attributes(G,'pos')
weights = nx.get_edge_attributes(G,'weight')
labels = nx.get_node_attributes(G,'label')
# Plot Figure
fig = plt.figure()
# Nodes
nx.draw_networkx_nodes(G,pos)
nx.draw_networkx_labels(G,pos,labels)
# Edges
out = nx.draw_networkx_edges(G,pos,edge_color = weights.values(), edge_cmap = plt.cm.jet, vmin = 0.0, vmax = max(weights.values()))
nx.draw_networkx_edge_labels(G,pos,edge_labels=weights)
plt.axis('off')
# Set Up Colorbar
cbar = plt.colorbar(out)
# Show
plt.show()
从这里我得到了一个从边缘到颜色的非常奇怪的分配。谁能解释一下?我是不是做错了什么?
最终,我通过对颜色进行排序找到了解决方法。
# Store edges
sorted_edge = []
sorted_edge.append((1,2))
sorted_edge.append((0,2))
sorted_edge.append((1,3))
sorted_edge.append((2,3))
sorted_edge.append((0,1))
# Sort edges
sorted_edge = sorted(sorted_edge)
# Sort colors
new_colors = []
sorted_indices = [sorted_edge.index(edge) for edge in weights.keys()]
for index in sorted_indices:
while len(new_colors) < index+1:
new_colors.append(0)
new_colors[index] = weights.values()[sorted_indices.index(index)]
首先,我认为这不是问题的预期解决方案?!其次,我正在对这个小例子进行更大的应用,其中分配完全失败,即使使用这种排序也是如此。因此,我想我最好退后一步,试着了解问题所在。
感谢您的回答。
最好的,乔纳斯
我试过你的代码片段,我可以重现这个问题。 这可以正常工作:
edges, colors = zip(*nx.get_edge_attributes(G,'weight').items())
nx.draw(G, pos, edgelist=edges, edge_color=colors, width=10, edge_cmap = plt.cm.jet, vmin = 0.0, vmax = max(weights.values()))
我的猜测是 draw_edges 没有保持 get_edge_attributes 定义的边顺序,但我不确定...
之前:
之后: