matplotlib:在同一轴上使用绘图和imshow时的限制

sor*_*imo 22 python plot matplotlib scipy

我一直试图将椭圆绘制成一个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-")
Run Code Online (Sandbox Code Playgroud)

我已经尝试在调用"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)
Run Code Online (Sandbox Code Playgroud)

如何强制阴谋不增加现有的数字限制?

解决方案(感谢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)
Run Code Online (Sandbox Code Playgroud)

Joe*_*ton 32

发生的事情是轴是自动缩放以匹配您绘制的每个项目的范围.图像的自动缩放比线条等更严格(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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


有了这个:

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 嗨乔,谢谢你的详细解释!我的matplotlib版本似乎太旧了(matplotlib .__ version__ ='0.99.1.1')因为它既不支持plt.subplots()也不支持ax.autoscale,但是当你指出autoscale = False时,我找到了[替代解决方案]( http://stackoverflow.com/questions/7386872/make-matplotlib-autoscaling-ignore-some-of-the-plots)修复了我的问题:每次我在最初调用imshow后使用plot时,我使用关键字参数scalex =假,scaley = False,这是正确的做法!谢谢! (3认同)