注意 - 这是对上一个问题的完全重写,我认为这个问题太复杂了。它提供了一个更简单的版本,如果我能解决,将导致进展。
我已根据此答案调整了我的代码:Is there a way to guarantee hierarchical output from NetworkX?
使用以下非常简单的代码,我会得到奇怪的着色行为。
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
G.add_node("ROOT")
for i in xrange(1):
for j in range(1):
G.add_node(str(j)+"_%i" % i, )
if j ==0:
G.add_edge("ROOT", str(j)+"_%i" % i)
else:
G.add_edge(str(j-1)+"_%i" %i, str(j)+"_%i" % i)
pos=nx.graphviz_layout(G,prog='dot')
for i in xrange(1):
nodelist = ['ROOT']
for j in range(1):
nodelist.append(str(j)+"_%i" % i )
nx.draw_networkx_nodes(G,pos, nodelist=nodelist, cmap=plt.get_cmap('Set3'), node_color=[0,1])
nx.draw_networkx_edges(G, pos,arrows=True)
limits=plt.axis('off')
似乎无关我为node_color
提供的值,只是值是否不同。例如,对于node_color = [0,1]
,我会得到与[0,.1]
或[0,1000]
完全相同的行为。 (为什么?colormap采用0到1之间的值)。
但是,如果我更改色彩图,则颜色会发生变化。例如:
如果我设置node_color = [3,3]
(或任何两个相同的值),我总是得到相同的东西,节点的颜色相同。
任何想法我在这里做错了什么?
答案 0 :(得分:2)
在到达色彩图之前,节点颜色值被标准化为区间[0,1]。这可能意味着使用全范围的颜色,无论给出的值的范围如何。要使用不同的缩放间隔,您可以设置vmin
和vmax
参数:
nx.draw_networkx_nodes(G,pos, nodelist, cmap=plt.get_cmap('Set3'),
node_color=[0,1], vmin=0, vmax=100)
来自draw_networkx_nodes() docs中 node_color 参数的说明:
如果是数值 指定它们将使用cmap和颜色映射到颜色 vmin,vmax参数。有关详细信息,请参阅matplotlib.scatter。
不幸的是,这些文档并没有很好地描述vmin
和vmax
的行为。但reference for matplotlib.scatter确实覆盖了更多:
vmin和vmax与范数结合使用以标准化亮度数据。 如果其中一个为None,则使用颜色数组的最小值和最大值。
因此,默认情况下,您传递的node_color数组的最小值在colormap上映射为0,最大值为1.使用线性映射将其间的所有内容映射到区间[0.0,1.0](此被称为规范化或 feature scaling )。以下是一些示例,从node_color
到色彩映射域中的点: