Подтвердить что ты не робот

Matplotlib: ограничения при использовании графика и imshow в тех же осях

Я пытаюсь построить эллипс в сюжете imshow. Он работает, но построение эллипса после построения изображения, похоже, увеличивает xlim и ylim, что приводит к границе, от которой я бы хотел избавиться:

BBHCh.png

Обратите внимание, что нет никакой белой границы сразу после вызова только 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)
4b9b3361

Ответ 1

Что происходит, так это то, что ось является автомасштабирующей, чтобы соответствовать экстентам каждого объекта, который вы рисуете. Изображения автомасштабируются намного жестче линий и т.д. (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