5

我想自动生成一系列裁剪为补丁的图。如果我尝试重用一个补丁对象,它会在画布上移动位置。

该脚本(基于 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)

第一个情节如下所示:补丁的正确位置 - 第一次绘制

但是在第二个'1.png'中,补丁已经移动了.. 贴片位置错误

但是再次重新绘制不会移动补丁。“2.png”和“3.png”看起来与“1.png”完全一样。

谁能指出我做错了什么的正确方向?

实际上,我使用的补丁相对复杂并且需要一些时间来生成——如果可能的话,我宁愿不必在每一帧都重新制作它们。

4

2 回答 2

2

unutbu 答案的替代方法是使用copy可以复制对象的包。在一个电话之后很难看出事情是如何变化的add_patch,但确实如此。修补程序的axesfigureextentsclip_box和属性已更改。不幸的是,这些属性中的每一个的表面打印都会导致相同的字符串,所以看起来它们并没有改变。但是这些属性中的一些或全部的基本属性(例如 is a )可能已更改。transformwindow_extentextentsBbox

复制调用将允许您为您制作的每个人物获得一个独特的补丁,而不知道它是什么类型的补丁。这仍然不能回答为什么会发生这种情况,但正如我在上面所写的,它是该问题的替代解决方案:

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调用会保存当前图形,这恰好是您想要的图形。

于 2011-11-17T16:19:28.613 回答
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)
于 2011-11-17T13:02:31.083 回答