2015-01-08 55 views
3

注 - 這是對上一個問題的完整重寫,我認爲這太複雜了。它提供了一個更簡單的版本,如果我能解決的話,將會取得進展。用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]完全相同的行爲。 (爲什麼?色彩地圖的值介於0和1之間)。

enter image description here

但是,如果我改變了顏色表,顏色DO變化。例如:

enter image description here

如果我設置node_color = [3,3](或任何兩個值哪都一樣),我總是得到同樣的事情,節點相同顏色。

enter image description here

任何想法,我做錯了什麼?

+0

一個獨立的例子會有所幫助,並且知道你的函數中有什麼'nodecolors'和'x'。 – jozzas

+0

添加了所有涉及的其他部分。 (我只是忽略它們,因爲它們有點牽扯,我是NetworkX的新手,所以我想我可能會犯一個新手錯誤。)我認爲這是一個獨立的問題,因爲我可以提出這個問題! – Wapiti

+0

您可以添加其他一些「時間」值的輸出嗎? – Joel

回答

2

在進入顏色映射之前,節點顏色值被標準化爲區間[0,1]。這大概意味着使用全範圍的顏色,而不管給定的值的範圍如何。要使用不同的時間間隔用於縮放,可以設置vminvmax參數:

nx.draw_networkx_nodes(G,pos, nodelist, cmap=plt.get_cmap('Set3'), 
         node_color=[0,1], vmin=0, vmax=100) 



的詳細說明:

node_color參數的描述在draw_networkx_nodes() docs

如果指定了數字值 ,則它們將映射到我們的顏色vmax,vmax參數。有關更多詳細信息,請參閱matplotlib.scatter。

不幸的是,這些文檔不能很好地描述vminvmax的行爲。但reference for matplotlib.scatter確實覆蓋了更多:

vmin和vmax與規範結合使用來規範化亮度數據。 如果其中一個是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];我實際上沒有運行這個)
+0

'vmax'和'vmin'是答案,由於某種原因,我不理解。你的回答並不能解釋爲什麼當我說'node_color = [0,1]'和'node_color = [0,.1]'時我得到了相同的結果(除非我遺漏了某些東西)。但是,當我設置'vmax = 1'和'vmin = 0'時,顏色表突然起作用。這表明有一些與默認值有點關係?感謝您讓我走上正軌。順便說一句,我在這裏問了一個非常類似的問題:http://stackoverflow.com/questions/27871827/colormap-not-working-in-networkx如果你想回答它,我會很樂意接受。 – Wapiti

+0

我編輯了答案以添加一些示例,但我可能誤解了您所困惑的內容。我認爲colormap *確實*「工作」 - 只是*默認情況下,'vmax'被設置爲'node_color' *的最大值。 – Lack