2015-10-17 23 views
2

我正在使用networkX從距離矩陣(emoji_sim,DataFrame)繪製網絡圖。下面是代碼:在Python中使用networkX替換節點標籤和表情符號

G = nx.from_numpy_matrix(np.array(emoji_sim)) 
nx.draw(G, edge_color='silver', node_color='lightsalmon', with_labels=True) 
plt.show() 

我知道有一種方法重新標記節點爲:

G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())), range(1, len(G.nodes())+1)))) 

但我想替換用的圖像(可能是從文件中讀取或使用Python的表情符號的節點標籤包)。有沒有辦法做到這一點?非常感謝!

爲了澄清,我試圖用圖像替換實際的圓。

+0

您是否想要更改標籤或爲節點更改繪製的實際圓? – Joel

+0

感謝您的提問。我正在嘗試將圓圈更改爲圖像。 – Vicky

+1

我不認爲它是內置的,但我認爲它不是很難。我沒有時間去完成整個解決方案,但這裏有一個提示,希望能夠引導其他人填寫詳細信息:您可以使用networkx來獲取節點位置。然後使用matplotlib在這些位置繪製圖像。然後繪製邊緣。 – Joel

回答

5

它背後的想法並不是很困難,但爲了讓它顯示(至​​少在ubunto),它給了我一些困難,因爲並非所有的字體都支持表情符號。我會直接展示一些鏈接,最終幫助我(也許你不需要那些鏈接)。

從表情符號cheat sheetemoji python package我拿起三個作爲示例顯示,這裏是代碼。

G = nx.Graph() 
G.add_nodes_from([0,1,2]) 
n0 = emoji.emojize(':thumbsup:',use_aliases=True) 
n1 = emoji.emojize(':sob:',use_aliases=True) 
n2 = emoji.emojize(':joy:',use_aliases=True) 
labels ={0:n0,1:n1,2:n2} 
nx.draw_networkx(G,labels=labels, node_color = 'w', linewidths=0, with_labels=True, font_family = 'Symbola' ,font_size = 35)  
plt.show() 

enter image description here

遇到的困難:

1 - 我的機器是在ubunto 14.04,我無法顯示他們總是表現爲矩形任何表情圖案

安裝需要的字體Symbola usin克以下命令(mentioned here)

sudo apt-get install ttf-ancient-fonts 

2- Maplotlib(其networkx調用繪製)不使用安裝的字體。

從一些有益的討論123456我複製並粘貼使用symbolA的.TFF字體文件在默認matplotib目錄(它獲取的字體使用)。

cp /usr/share/fonts/truetype/ttf-ancient-scripts/Symbola605.ttf /usr/share/matplotlib/mpl-data/fonts/ttf 

然後我不得不刪除fontlist.cache文件來裝載新的字體。

rm ~/.cache/matplotlib/fontList.cache 

注意

您可以通過改變輸入到draw_networkx例如有不同的看法不發送linewidths將顯示每個節點的圓形邊框,同樣如果您想要節點的特定背景色,請將color_node從白色更改爲所需的顏色...有關詳細信息,請檢查documentation

+0

看看'nx.draw_networkx_labels'([文件](https://networkx.github.io/documentation/latest/reference/generated/networkx.drawing.nx_pylab.draw_networkx_labels.html)),也通常是更好的用pos = nx.spring_layout(G)'或其他一些首選的佈局預定位置'pos'。這讓你在不改變節點位置的情況下對曲線做很多事情。 – Joel

+1

每次'spring_layout'運行時,它都從一個隨機的初始條件開始。所以如果你想做多種顏色,或者把一些節點放在其他節點上,或者只是做任何涉及調用多個繪圖命令的事情,那麼整個網絡將被重新定位。所以你是對的,在這種情況下沒有必要,但對於你可能嘗試的大部分精細的事情來說,這很有用。由於您已將線寬設置爲零,並將節點顏色設置爲白色,而不是僅繪製標籤,因此您看起來並不像其他部件那樣熟悉networkx繪圖命令。我想我也會提到它。 – Joel

+0

啊現在更清楚了,謝謝你的提示。我從現在開始考慮這個問題。 –