2012-02-02 19 views
21

He intentado trazar una elipse en un diagrama de imshow. Funciona, pero el trazado de la elipse después de trazar la imagen parece aumentar xlim y ylim, lo que resulta en una frontera, lo que me gustaría deshacerse de:matplotlib: límites cuando se usa plot e imshow en los mismos ejes

Tenga en cuenta que no hay frontera blanca directamente después de llamar a imshow solamente.

Mi código es el siguiente:

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

He tratado de establecer los límites antes y después de llamar "trama", sin efecto

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

¿Cómo puedo forzar parcela no aumentar ¿Límites de figura existentes?

Solución (gracias 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) 

Respuesta

29

Lo que pasa es que el eje se AutoScaling para que coincida con la extensión de cada elemento que trama. Las imágenes son autoescaladas mucho más ajustadas que las líneas, etc. (imshow básicamente llama al ax.axis('image')).

Obtener los límites del eje antes y configurarlos después debería haber funcionado. (Sin embargo, es más limpio hacer limits = axes.axis() antes y axes.axis(limits) después)

Sin embargo, si no desea que las cosas cambien automáticamente, lo mejor es desactivar la autoescalado después del trazado inicial. Pruebe axes.autoscale(False) después de trazar la imagen.

A modo de ejemplo, comparar esto:

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 esta:

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

Hola Joe, gracias por su detallada exp ¡lanation! Mi versión matplotlib parece ser demasiado antigua (matplotlib .__ version__ = '0.99.1.1') ya que no admite ni plt.subplots() ni ax.autoscale, sin embargo, como señaló autoscale = False, encontré una [solución alternativa] (http://stackoverflow.com/questions/7386872/make-matplotlib-autoscaling-ignore-some-of-the-plots) que soluciona mi problema: cada vez que uso plot después de llamar inicialmente a imshow, utilizo la palabra clave arguments scalex = False, scaley = False, ¡que hace lo correcto! ¡Gracias! – soramimo

Cuestiones relacionadas