2014-03-28 55 views
14

我對networkx比較陌生,使用matplotlib.pyplot進行繪圖並希望知道如何修改節點輪廓的顏色(或其他屬性,例如權重)。通過「輪廓」我不是指兩個節點之間的弧或邊;我的意思是在繪製網絡時默認用於表示節點的圓周圍的細黑線。如何修改節點的輪廓顏色在networkx中?

因此,例如,當我提出具有隻是一個單一的節點的曲線圖並顯示它:

from networkx import * 
import matplotlib.pyplot as plt 
plt.ion() 
G = Graph() 
G.add_node(1) 
draw(G) 

我看到單個紅色節點具有薄黑色輪廓(和黑色的「1」在其內部,這是節點的標籤)。我怎樣才能將這個輪廓的顏色從黑色改變爲紅色(「#FF0000」)或其他顏色?或者,我可以完全抑制輪廓的顯示嗎?

我在想象必須有一個屬性,類似於edge_color或node_color,我可以設置。但是,我無法通過網絡搜索,網絡x文檔或查看圖庫示例找到這樣的屬性。如果有人能指出我將不勝感激的適當屬性。謝謝!

+1

'draw' calls'draw_networkx' see http://networkx.github.io/documentation/latest/reference/generated/networkx.drawing.nx_pylab.draw_networkx.html#networkx.drawing.nx_pylab.draw_networkx,您可以設置邊緣顏色參數 – EdChum

+2

'edge_color'只設置圖形的邊緣顏色,而問題指的是節點輪廓(相當於pyplot中線條圖的'marker_edge_color'或'mec')。我正在尋找,但還沒有找到一個好的解決方案... – surfreak

+0

@surfreak啊是的,對不起我的錯誤,沒有立即答案,將挖掘周圍 – EdChum

回答

11

好吧,這是一種哈克,但它的作品。這是我想出來的。

的問題

networkx.draw()調用networkx.draw_networkx_nodes(),然後調用pyplot.scatter()繪製的節點。問題是draw_networkx_nodes()接受的關鍵字參數不會傳遞到scatter()。 (source here


爲了解決這一點,我基本上解體networkx.draw()成它的組分:draw_networkx_nodesdraw_networkx_edges,和draw_networkx_labels

解決方案

我們可以採取的draw_networkx_nodes()的返回值 - 一個PathCollection - 和對操作:您可以分別使用PathCollection.set_edgecolor()PathCollection.set_edgecolors()與任何一種顏色或列表。

示例代碼:

from networkx import * 
import matplotlib.pyplot as plt 
G = Graph() 
G.add_node(1) 
# Need to specify a layout when calling the draw functions below 
# spring_layout is the default layout used within networkx (e.g. by `draw`) 
pos = spring_layout(G) 
nodes = draw_networkx_nodes(G, pos) 
# Set edge color to red 
nodes.set_edgecolor('r') 
draw_networkx_edges(G, pos) 
# Uncomment this if you want your labels 
## draw_networkx_labels(G, pos) 
plt.show() 

如果你打算使用這個有很多,這可能更有意義(IMO)剛剛重新定義draw_networkx_nodes實際的kwargs傳遞到scatter。但上面的將會工作。

要完全去除標記邊緣,只需將顏色設置爲None而不是'r'即可。

+2

有沒有人看到一個原因爲什麼kwargs **不應該被傳遞給分散?如果不是,我會提交一個錯誤報告。 – surfreak

+0

請確實提交錯誤報告。我認爲沒有通過kwargs來避免draw_networkx_edges()等類似參數的衝突/混淆。matplotlib的繪圖接口是十分笨拙的,可以使用適當的設計。 – Aric

+0

感謝@surfreak的解釋和示例代碼。從來沒有我很高興看到一個小紅點(即,你是對的,它的工作原理)。 – user1071516

2

我知道這是一個antient線程,但我也在尋找這個答案,並最終找到了本地非hacky的方式。您可以將參數linewidths = 0傳遞給draw函數。我認爲這隻影響節點邊界的寬度,而不是邊緣寬度(它由width = x控制)。

+1

這是這樣的,謝謝,奇怪的是他們沒有給這個參數一個更好的名字 –

1

如果你想改變節點的輪廓的顏色,你可以做:

draw(G, linewidths=2) 
ax = plt.gca() # to get the current axis 
ax.collections[0].set_edgecolor("#FF0000") 

就是這樣。

  • ax.collections[0]是管理節點
  • ax.collections[1]是管理邊緣如果你有一些一個LineCollection對象PathCollection對象。

您可以使用給定的集合快速修改許多其他屬性。