【问题标题】:Drawing colored trees with NetworkX使用 NetworkX 绘制彩色树
【发布时间】:2015-03-06 00:43:40
【问题描述】:

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

我已经根据这个 SO 答案调整了我的代码: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] 完全相同。 (为什么?颜色图的取值介于 0 和 1 之间)。

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

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

有什么想法我在这里做错了吗?

【问题讨论】:

  • 一个独立的示例会有所帮助,同时了解您的函数中的 nodecolorsx 是什么。
  • 添加了所有其他相关的部分。 (我只是一开始就省略了它们,因为它们有点参与,而且我是 NetworkX 的新手,所以我认为我可能会犯一个新手错误。)我认为这是我可以提出的问题的自包含!
  • 你能添加一些其他“时间”值的输出吗?
  • 你去,做了0,1和2次。
  • 我已经完全重写了这个问题,让它变得简单多了。我希望这有助于确定实际发生的情况。没有人需要知道所有其他的东西。

标签: python matplotlib tree graphviz networkx


【解决方案1】:

在获取颜色图之前,节点颜色值被标准化为区间 [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() docsnode_color参数的描述:

如果数值 指定它们将使用 cmap 映射到颜色和 vmin,vmax 参数。有关详细信息,请参阅 matplotlib.scatter。

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

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

因此,默认情况下,您传递的 node_color 数组的最小值在颜色图上映射为 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];我实际上并没有运行它)

【讨论】:

  • vmaxvmin 是答案,出于某种原因我不明白。你的回答没有解释为什么当我说node_color = [0,1]node_color=[0,.1] 时我得到相同的结果(除非我错过了什么)。但是,当我设置 vmax=1vmin=0 时,颜色图突然起作用了。这表明默认值有一些偏差?谢谢你让我走上正轨。顺便说一句,我在这里问了一个非常相似的问题:stackoverflow.com/questions/27871827/…如果你也想回答,我很乐意接受。
  • 我编辑了答案以添加一些示例,但我可能误解了您的困惑。我认为颜色图确实“起作用”——只是默认情况下,vmax 设置为最大值node_color
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2012-03-03
  • 1970-01-01
相关资源
最近更新 更多