【问题标题】:Colormap not working in NetworkX颜色图在 NetworkX 中不起作用
【发布时间】:2015-01-10 01:17:35
【问题描述】:

我正在尝试制作彩色图表。我不断遇到奇怪的行为。

我无法让颜色图自动为节点分配颜色。我尝试执行此操作的所有节点都以相同的颜色结束!

浮动是应该分配给 6 个节点的颜色。 7 个浮点数中有两个是相同的,因为它是一个循环。

当我手动指定节点的颜色(node_color=['r'] 等)时,它可以正常工作,不仅适用于根(红色),而且适用于循环中的节点。

代码:

t=0
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()

#MAKE
G.add_node("ROOT")
#make all others
for i in x:
    for ct,j in enumerate(i):
        G.add_node(j[t] )
        if ct ==0:
            G.add_edge("ROOT", j[t])
        else:
            G.add_edge(i[ct-1][t], i[ct][t])
nx.write_dot(G,'g')
#DRAW
pos=nx.graphviz_layout(G,prog='neato')
nx.draw_networkx_nodes(G,pos, nodelist=['ROOT'], node_color=['r'])
#draw all others
for i in x:
    for ct,j in enumerate(i):
        print CD[j[t]]#, np.around([CD[j[t]]],decimals=2)
        nx.draw_networkx_nodes(G,pos, nodelist = [j[t]], cmap=plt.get_cmap('Set3') ,node_color=np.around([CD[j[t]]],decimals=2))#float(c) for c in nodecolors(x[i],1)] )
nx.draw_networkx_edges(G, pos,arrows=True)

#Display properties
limits=plt.axis('off')         

这里,x 是一个节点名称数组,CD 是一个将名称映射到浮点数的字典。为了完整起见,它们是:

x = [[(1.000004+0j)], [(-0.5000065+0.86602454j)], [(-0.5000065-0.86602454j)],[(1.000004+0j)],[(-0.5000065+0.86602454j)],[(-0.5000065-0.86602454j)]]

CD = {(-0.50000649677999998-0.8660245358880001j): 0.7142857142857143,
 (-0.50000649677999998+0.8660245358880001j): 0.5714285714285714,
 (-0.50000049676800007-0.86603492822400008j): 0.14285714285714285,
 (-0.50000049676800007+0.86603492822400008j): 0.42857142857142855,
 0j: 0.0,
 (0.99999200001600019-0j): 0.8571428571428571,
 (1.000004000004+0j): 0.2857142857142857}

颜色图功能在其他情况下对我有用,所以我觉得我犯了一个基本错误。有任何想法吗?

【问题讨论】:

  • 我无法在没有错误的情况下运行您的代码(j[t] 上的TypeError: 'complex' object has no attribute '__getitem__'),但这与我回答的您的其他问题(stackoverflow.com/questions/27831022/…)相同。因为您一次只将一个节点传递给draw_networkx_nodes,所以它会“规范化”长度为1 的颜色数组,而不考虑其他节点。您应该摆脱循环并将一个数组中的所有节点传递给draw_networkx_nodes
  • 我认为您需要在 x 周围再添加一组括号才能正常运行。我忘记了那些。如果我设置vmax=1vmin=0,它 循环一起工作。
  • 非常感谢您的帮助!这几天我一直在为此苦苦挣扎。
  • 不客气。不过,请考虑摆脱循环 - 创建一个列表毫无意义,在 for 循环中展开它,然后一次将一个元素传递给一个无论如何都需要列表的函数。

标签: python matplotlib graphviz networkx digraphs


【解决方案1】:

由于这是旧的,Lack 回答了 cmets 中的问题,我在这里复制他的答案并接受:

我无法在没有错误的情况下运行您的代码 (TypeError: 'complex' object has no attribute '__getitem__' on j[t]),但这与您回答的其他问题 (stackoverflow.com/questions/27831022/...) 的问题相同。因为您一次只将一个节点传递给draw_networkx_nodes,它会“规范化”长度为1 的颜色数组,而不考虑其他节点。您应该摆脱循环并将一个数组中的所有节点传递给draw_networkx_nodes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多