matplotlib: limites lors de l'utilisation de plot et imshow dans les mêmes axes

J'ai essayé de tracer une ellipse dans un tracé imshow. Cela fonctionne, mais tracer l'ellipse après avoir tracé l'image semble augmenter xlim et ylim, ce qui entraîne une bordure, dont je voudrais me débarrasser:

Notez qu'il n'y a pas de bordure blanche directement après avoir appelé imshow uniquement.

Mon code se présente comme suit:

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

J'ai essayé de définir les limites avant et après avoir appelé "plot", sans effet

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

Comment puis-je forcer le tracé à ne pas augmenter existant figure limites?

Solution (merci à 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)
22
demandé sur Falko 2012-02-03 02:09:05

1 réponses

Ce qui se passe, c'est que l'axe est autoscaling pour correspondre aux étendues de chaque élément que vous tracez. Les Images sont autoscaled beaucoup plus serré que les lignes, etc (imshow appelle essentiellement ax.axis('image')).

Obtenir les limites d'axe avant et les définir après aurait dû fonctionner. (Il est plus propre de faire juste limits = axes.axis() avant et axes.axis(limits) après, cependant.)

Cependant, si vous ne voulez pas que les choses soient mises à l'échelle automatique, il est préférable de désactiver la mise à l'échelle automatique après le tracé initial. Essayez axes.autoscale(False) après avoir tracé le image.

À titre d'exemple, comparez ceci:

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

entrez la description de l'image ici


Avec ceci:

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

entrez la description de l'image ici

31
répondu Joe Kington 2012-02-02 22:24:40