2011-11-17 11 views
5

मैं पैट पर चिपकने वाले प्लॉट्स की एक श्रृंखला उत्पन्न करना चाहता हूं। यदि मैं पैच ऑब्जेक्ट को आज़माकर पुनः उपयोग करता हूं, तो यह कैनवास में स्थिति को स्थानांतरित करता है।matplotlib में पैच ऑब्जेक्ट्स को बिना किसी स्थानांतरित स्थिति

यह स्क्रिप्ट (यान द्वारा पिछले प्रश्न के उत्तर पर आधारित) दर्शाती है कि क्या हो रहा है।

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

हालांकि फिर से replotting पैच स्थानांतरित नहीं होता है । '2.png' और '3.png' बिल्कुल '1.png' जैसा दिखता है।

क्या कोई मुझे गलत दिशा में सही दिशा में इंगित कर सकता है ??

असल में, मेरे द्वारा उपयोग किए जा रहे पैच अपेक्षाकृत जटिल हैं और उत्पन्न करने में कुछ समय लगता है - यदि संभव हो तो मैं उन्हें हर फ्रेम को रीमेक नहीं करना चाहूंगा।

+1

वास्तव में विचित्र भाग यह है कि यह केवल तब होता है जब आप 'savefig' कहते हैं, और यदि आप 'शो' कहते हैं तो नहीं ... –

उत्तर

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, transform और window_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 कॉल वर्तमान आकृति को बचाता है, जो आप चाहते हैं कि होता है।

संबंधित मुद्दे