2013-10-02 48 views
1

我試圖生成圖的子圖的圖像,其中節點應出現在這兩個圖的相同位置。pos參數爲networkx.draw()不起作用

基於documentation for networkx.draw the "pos" argument的draw函數接受一個字典,它指定了節點的位置。我看幾個例子,人們使用類似此模式的pos參數:

positions = networkx.spring_layout(GraphObject) 
networkx.draw(GraphObject, positions) 

然而,當我嘗試這個我發現的位置顯然忽視 - 或者至少當我畫圖,記錄的位置其節點,然後使用該字典作爲繪製子圖的pos參數,相應的節點不會繪製在相同的位置。

這是一個簡單的重現器,演示了這個問題。我認爲這段代碼應該做的是創建兩個圖形「g」和「h」的兩個.png文件。節點「c」和「d」應該在「h」的圖形中的位置與它們在「g」中的位置相同 - 但是它們不是。

#!/usr/bin/python 

import matplotlib.pyplot as plt 
import networkx as nx 
import pylab 

g = nx.Graph() 
g.add_node('a') 
g.add_node('b') 
g.add_node('c') 
g.add_node('d') 
g.add_edge('a', 'b') 
g.add_edge('c', 'd') 

h = nx.Graph() 
h.add_node('c') 
h.add_node('d') 

# Define the positions of a, b, c, d 
positions = nx.spring_layout(g) 

# Produce image of graph g with a, b, c, d and some edges. 
nx.draw(g, positions) 
plt.savefig("g.png") 

# Clear the figure. 
plt.clf() 

# Produce image of graph h with two nodes c and d which should be in 
# the same positions of those of graph g's nodes c and d. 
nx.draw(h, positions) 
plt.savefig("h.png") 

任何人都可以請建議我做錯了什麼,或者如何生成子圖的圖像,其中節點是在同一位置爲全圖的?

回答

1

不同使用tcaswell的尖端爲起點我發現這工作對我來說:

#!/usr/bin/python 

import matplotlib.pyplot as plt 
import networkx as nx 

g = nx.Graph() 
g.add_node('a') 
g.add_node('b') 
g.add_node('c') 
g.add_node('d') 
g.add_edge('a', 'b') 
g.add_edge('c', 'd') 

h = nx.Graph() 
h.add_node('c') 
h.add_node('d') 

# Define the positions of a, b, c, d 
positions = nx.spring_layout(g) 

nx.draw(g, positions) 

# Save the computed x and y dimensions for the entire drawing region of graph g 
xlim = plt.gca().get_xlim() 
ylim = plt.gca().get_ylim() 

# Produce image of graph g with a, b, c, d and some edges. 
plt.savefig("g.png") 
#plt.show() 

# Clear the figure. 
plt.clf() 

# Produce image of graph h with two nodes c and d which should be in 
# the same positions of those of graph g's nodes c and d. 
nx.draw(h, positions) 

# Ensure the drawing area and proportions are the same as for graph g. 
plt.axis([ xlim[0], xlim[1], ylim[0], ylim[1] ]) 

#plt.show() 
plt.savefig("h.png") 
2

的問題不是networkx是誤運行得,它是x和y範圍是在兩個圖

# Define the positions of a, b, c, d 
positions = nx.spring_layout(g) 
plt.figure() 
# Produce image of graph g with a, b, c, d and some edges. 
nx.draw(g, positions) 
#plt.savefig("g.png") 
_xlim = plt.gca().get_xlim() # grab the xlims 
_ylim = plt.gca().get_ylim() # grab the ylims 
# Clear the figure. 
# plt.clf() 
plt.figure() 
# Produce image of graph h with two nodes c and d which should be in 
# the same positions of those of graph g's nodes c and d. 
nx.draw(h, positions) 

plt.gca().set_xlim(_xlim) # set the xlims 
plt.gca().set_ylim(_ylim) # set the ylims 
# plt.savefig("h.png") 

enter image description here enter image description here

+0

謝謝你看看 - 但你真的測試t他上面的代碼,看看它是否將節點c和d放在兩個地塊的同一地點?當我運行你的代碼時,我有兩個問題 - 第一,如果我不放回plt.savefig行,則不會輸出或顯示任何內容,也不會顯示在屏幕上或其他地方。 如果我放回plt.savefig行,節點顯示在不同的位置。 – deadcode

+0

我刪除了'savefig'這幾行,因爲當人們發佈在我的系統上有副作用的代碼時,它確實令人討厭。你的'matplotlibrc'中有'tight_boundingbox = True'嗎? – tacaswell

+0

我使用的安裝默認matplotlibrc沒有爲tight_boundingbox設置任何內容,所以如果tight_boundingbox = True是默認值,那麼是嗎?我懷疑這樣的事情是讓我感覺到的。我發現節點被放置在相同的座標處,但邊界框似乎沒有相同的大小。 – deadcode