2011-11-17 47 views
5

我想自動生成一系列被修剪爲修補程序的圖。如果我嘗試重新使用修補程序對象,它將在畫布上移動位置。重新使用matplotlib中的修補程序對象而不移動它們的位置

此腳本(基於對Yann前一個問題的回答)演示了發生的事情。

import pylab as plt 
import scipy as sp 
import matplotlib.patches as patches 

sp.random.seed(100) 
x = sp.random.random(100) 
y = sp.random.random(100) 
patch = patches.Circle((.75,.75),radius=.25,fc='none') 


def doplot(x,y,patch,count): 
    fig = plt.figure() 
    ax = fig.add_subplot(111) 
    im = ax.scatter(x,y) 
    ax.add_patch(patch) 
    im.set_clip_path(patch) 
    plt.savefig(str(count) + '.png') 


for count in xrange(4): 
    doplot(x,y,patch,count) 

第一個情節是這樣的:Correct position of patch - first time plotted

但在第二個「1.png」,該補丁已經移動.. Wrong position of the patch

但是再次型重構不動補丁。 '2.png'和'3.png'看起來與'1.png'完全一樣。

任何人都可以指出我在做什麼錯了嗎?

實際上,我使用的補丁比較複雜,需要一些時間來生成 - 如果可能的話,我寧願不必在每一幀都重新制作它們。

+1

真正的bizzare部分是,這隻會發生,如果你打電話'savefig',而不是如果你打電話'show' ... –

回答

2

這個問題可以通過對每個圖使用相同的軸來避免,每次迭代後調用ax.cla()來清除繪圖。

import pylab as plt 
import scipy as sp 
import matplotlib.patches as patches 

sp.random.seed(100) 
patch = patches.Circle((.75,.75),radius=.25,fc='none') 

fig = plt.figure() 
ax = fig.add_subplot(111) 

def doplot(x,y,patch,count): 
    ax.set_xlim(-0.2,1.2) 
    ax.set_ylim(-0.2,1.2) 
    x = sp.random.random(100) 
    y = sp.random.random(100) 
    im = ax.scatter(x,y) 
    ax.add_patch(patch) 
    im.set_clip_path(patch) 
    plt.savefig(str(count) + '.png') 
    ax.cla() 

for count in xrange(4): 
    doplot(x,y,patch,count) 
+0

謝謝@unutbu!完美的作品。 –

+0

太棒了;很高興我能幫上忙!請不要接受這個答案,因爲我想知道爲什麼該補丁在原始代碼中也被轉換了。 – unutbu

2

到unutbu的回答另一種,是使用copy包,它可以複製的對象。在呼叫add_patch之後,很難看到情況如何變化,但它們是。 axes,figure,extents,clip_box,transformwindow_extent補丁的屬性被改變。不幸的是,這些屬性中的每一個的表面印刷結果都是相同的字符串,所以看起來他們沒有改變。但是一些或所有這些屬性的基本屬性,例如extentsBbox,可能已更改。

複製調用將允許您爲每個製作的圖形獲取唯一的補丁,而無需知道它是哪種補丁。這仍然沒有回答爲什麼出現這種情況,但正如我上面寫的是另一種解決問題的辦法:

import copy 

def doplot(x,y,patch,count): 
    newPatch = copy.copy(patch) 
    fig = plt.figure(dpi=50) 
    ax = fig.add_subplot(111) 
    im = ax.scatter(x,y) 
    ax.add_patch(newPatch) 
    im.set_clip_path(newPatch) 
    plt.savefig(str(count) + '.png') 

您也可以使用fig.savefig(str(count) + '.png')。這明確地保存了數字fig,其中plt.savefig調用保存當前數字,這恰好是您想要的數字。

相關問題