2012-02-02 10 views
21

Ho cercato di tracciare un'ellisse in una trama di presentazione. Funziona, ma tracciando l'ellisse dopo aver tracciato l'immagine sembra aumentare XLIM e ylim, risultando in un confine, che mi piacerebbe per sbarazzarsi di:matplotlib: limiti quando si utilizza la trama e l'imshow negli stessi assi

Nota che c'è nessuna bordo bianco direttamente dopo aver chiamato solo imshow.

Il mio codice si presenta come segue:

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-") 

Ho provato a installare i limiti prima e dopo la chiamata "complotto", senza alcun effetto

# 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) 

Come posso forzare trama non aumentare limiti di figure esistenti?

Solution (grazie a Joe):

#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) 

risposta

29

Quello che sta succedendo è che l'asse è autoscaling per abbinare le estensioni di ogni elemento che si trama. Le immagini vengono ridimensionate automaticamente molto più delle linee, ecc. (imshow in pratica chiama ax.axis('image')).

Ottenere i limiti degli assi prima e impostarli dopo avrebbe dovuto funzionare. (E 'più pulito per fare solo limits = axes.axis() prima e axes.axis(limits) dopo, però.)

Tuttavia, se non si desidera che le cose autoscale, è meglio basta girare autoscaling dopo la trama iniziale. Prova axes.autoscale(False) dopo aver tracciato l'immagine.

A titolo di esempio, confrontare questo:

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


Con questo:

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

Ciao Joe, grazie per il vostro exp dettagliata lanation! La mia versione di matplotlib sembra essere troppo vecchia (matplotlib .__ version__ = '0.99.1.1') in quanto non supporta né plt.subplots() né ax.autoscale, tuttavia come hai indicato autoscale = False, ho trovato una [soluzione alternativa] (http://stackoverflow.com/questions/7386872/make-matplotlib-autoscaling-ignore-some-of-the-plots) che corregge il mio problema: ogni volta che uso la trama dopo aver inizialmente chiamato imshow, utilizzo gli argomenti della parola chiave scalex = False, scaley = False, che fa la cosa giusta! Grazie! – soramimo

Problemi correlati