使用plot和imshow在同一坐标系中时,matplotlib的限制

26

我一直在尝试将椭圆绘制到imshow图中。 它可以工作,但在绘制图像后绘制椭圆似乎会增加xlim和ylim,从而产生一个边框,我想摆脱它:

请注意,在调用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-")

我之前尝试在调用"plot"之前和之后设置限制,但没有效果。

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

我怎样才能强制绘图不增加现有图形范围?

解决方案(感谢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)
1个回答

35

发生的情况是轴自适应以匹配绘制每个项目的范围。图像比线条等更紧密地自动缩放(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()

在此输入图像描述


使用此代码:

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

在这里输入图片描述


3
嗨,乔!感谢你详细的说明。我的matplotlib版本似乎太旧了(matplotlib.version='0.99.1.1'),它既不支持plt.subplots()也不支持ax.autoscale。然而,正如你所指出的autoscale=False,我找到了一种替代解决方案,可以解决我的问题:每次在首次调用imshow后使用plot时,我都要使用关键字参数scalex=False、scaley=False,这样就能解决问题了!谢谢! - soramimo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接