用NetworkX绘制彩色的树木

时间:2015-01-08 00:19:37

标签: python matplotlib tree graphviz networkx

注意 - 这是对上一个问题的完全重写,我认为这个问题太复杂了。它提供了一个更简单的版本,如果我能解决,将导致进展。

我已根据此答案调整了我的代码: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之间的值)。

enter image description here

但是,如果我更改色彩图,则颜色会发生变化。例如:

enter image description here

如果我设置node_color = [3,3](或任何两个相同的值),我总是得到相同的东西,节点的颜色相同。

enter image description here

任何想法我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

在到达色彩图之前,节点颜色值被标准化为区间[0,1]。这可能意味着使用全范围的颜色,无论给出的值的范围如何。要使用不同的缩放间隔,您可以设置vminvmax参数:

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。

不幸的是,这些文档并没有很好地描述vminvmax的行为。但reference for matplotlib.scatter确实覆盖了更多:

  

vmin和vmax与范数结合使用以标准化亮度数据。 如果其中一个为None,则使用颜色数组的最小值和最大值。

因此,默认情况下,您传递的node_color数组的最小值在colormap上映射为0,最大值为1.使用线性映射将其间的所有内容映射到区间[0.0,1.0](此被称为规范化 feature scaling )。以下是一些示例,从node_color到色彩映射域中的点:

  • [0,0.1]→[0,1]
  • [0,1000]→[0,1]
  • [0,200,1000]→[0,0.2,1]
  • [10,15,20]→[0,0.5,1]
  • [0,0]→[0,0] (或者它可能是[1,1];我实际上并没有这样做)