2012-02-02 11 views
21

मैं एक इलशो प्लॉट में एक अंडाकार प्लॉट करने की कोशिश कर रहा हूं। यह काम करता है, लेकिन छवि की साजिश रचने के बाद दीर्घवृत्त की साजिश रचने से छुटकारा पाने के लिए एक सीमा है, जो मैं करना चाहते हैं, जिसके परिणामस्वरूप xlim और ylim बढ़ाने के लिए लगता है:matplotlib: साजिश का उपयोग करते समय सीमाएं और उसी अक्ष में imshow

नोट नहीं सफेद सीमा सीधे है कि वहाँ केवल इशशो कॉल करने के बाद।

मेरे कोड इस प्रकार दिखता है:

self.dpi = 100 
self.fig = Figure((6.0, 6.0), dpi=self.dpi) 
self.canvas = FigureCanvas(self.fig) 
self.canvas.setMinimumSize(800, 400) 
self.cax = None 
self.axes = self.fig.add_subplot(111) 
self.axes.imshow(channel1, interpolation="nearest") 
self.canvas.draw() 
self.axes.plot(dat[0], dat[1], "b-") 

मैंने पहले और "साजिश" बुला के बाद सीमा सेट की कोशिश की है, कोई प्रभाव नहीं के साथ

# get limits after calling imshow 
xlim, ylim = pylab.xlim(), pylab.ylim() 
... 
# set limits before/after calling plot 
self.axes.set_xlim(xlim) 
self.axes.set_ylim(ylim) 

मैं कैसे को बढ़ाने के लिए नहीं साजिश मजबूर कर सकते हैं मौजूदा आंकड़े सीमाएं?

समाधान (जो करने के लिए धन्यवाद):

#for newer matplotlib versions 
self.axes.imshow(channel1, interpolation="nearest") 
self.axes.autoscale(False) 
self.axes.plot(dat[0], dat[1], "b-") 

#for older matplotlib versions (worked for me using 0.99.1.1) 
self.axes.imshow(channel1, interpolation="nearest") 
self.axes.plot(dat[0], dat[1], "b-", scalex=False, scaley=False) 

उत्तर

29

बात ये है कि धुरी प्रत्येक आइटम आप साजिश के विस्तार से मिलान करने के autoscaling जाता है। छवियां लाइनों की तुलना में बहुत कठिन हैं, आदि (imshow मूल रूप से ax.axis('image') पर कॉल करती हैं)।

अक्ष से पहले सीमाएं प्राप्त करना और काम करने के बाद उन्हें सेट करना। (हालांकि, limits = axes.axis() से पहले और axes.axis(limits) के बाद बस क्लीनर करने के लिए क्लीनर है।)

हालांकि, अगर आप चीजों को ऑटोस्केल करना नहीं चाहते हैं, तो प्रारंभिक साजिश के बाद ऑटो ऑटोकलिंग बंद करना सबसे अच्छा है। छवि की साजिश के बाद axes.autoscale(False) आज़माएं। इस के साथ

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
ax.imshow(np.random.random((10,10))) 
ax.plot(range(11)) 
plt.show() 

enter image description here


:

उदाहरण के लिए, इस तुलना

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
ax.imshow(np.random.random((10,10))) 
ax.autoscale(False) 
ax.plot(range(11)) 
plt.show() 

enter image description here

+3

हाय जो, अपने विस्तृत exp के लिए धन्यवाद lanation! मेरा matplotlib संस्करण बहुत पुराना प्रतीत होता है (matplotlib .__ version__ = '0.99.1.1') क्योंकि यह न तो plt.subplots() और न ही ax.autoscale का समर्थन करता है, हालांकि आपने ऑटोस्केल = गलत बताया है, मुझे एक [वैकल्पिक समाधान] मिला है (http://stackoverflow.com/questions/7386872/make-matplotlib-autoscaling-ignore-some-of-the-plots) जो मेरी समस्या को हल करता है: प्रत्येक बार जब मैं imshow को कॉल करने के बाद साजिश का उपयोग करता हूं, तो मैं कीवर्ड तर्क स्केलक्स = झूठी, स्केली = झूठी, जो सही काम करता है! धन्यवाद! – soramimo

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