【问题标题】:matplotlib: limits when using plot and imshow in same axesmatplotlib:在同一轴上使用 plot 和 imshow 时的限制
【发布时间】:2012-02-25 14:30:28
【问题描述】:

我一直在尝试将椭圆绘制成 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)

【问题讨论】:

    标签: python plot scipy matplotlib


    【解决方案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()
    


    有了这个:

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

    【讨论】:

    • 嗨乔,感谢您的详细解释!我的 matplotlib 版本似乎太旧了(matplotlib.__version__ = '0.99.1.1'),因为它既不支持 plt.subplots() 也不支持 ax.autoscale,但是正如您指出的 autoscale=False,我找到了一个修复的 alternative solution我的问题:每次我在最初调用 imshow 后使用 plot 时,我都使用关键字参数 scalex=False,scaley=False,这样做是正确的!谢谢你!
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 2013-08-16
    • 2013-09-12
    • 1970-01-01
    • 2016-03-04
    • 2012-09-07
    • 1970-01-01
    • 2020-05-06
    相关资源
    最近更新 更多