使用matplotlib imshow和scatter获得相同的子图大小

时间:2017-06-20 13:27:22

标签: python matplotlib

我正在尝试在同一图中绘制图像(使用matplotlib.imshow)和散点图。尝试此操作时,图像显示小于散点图。小示例代码如下所示:

import matplotlib.pyplot as plt
import numpy as np

image = np.random.randint(100,200,(200,200))
x = np.arange(0,10,0.1)
y = np.sin(x)

fig, (ax1, ax2) = plt.subplots(1,2)
ax1.imshow(image)
ax2.scatter(x,y)

plt.show()

其中给出了下图:

enter image description here

如何让两个子凹坑具有相同的高度? (和我想的宽度)

我已尝试使用gridspec回复中显示的this

fig=plt.figure()
gs=GridSpec(1,2)

ax1=fig.add_subplot(gs[0,0])
ax2=fig.add_subplot(gs[0,1])
ax1.imshow(image)
ax2.scatter(x,y)

但是这给出了相同的结果。我还尝试使用以下方法手动调整子图大小:

fig = plt.figure()
ax1 = plt.axes([0.05,0.05,0.45,0.9])
ax2 = plt.axes([0.55,0.19,0.45,0.62])

ax1.imshow(image)
ax2.scatter(x,y)

通过反复试验,我可以将两个子图获得正确的大小,但是整体图形大小的任何变化都意味着子图将不再具有相同的大小。

有没有办法让imshowscatter图在图中看起来大小相同,而无需手动更改轴尺寸?

我正在使用Python 2.7和matplotlib 2.0.0

4 个答案:

答案 0 :(得分:17)

您不希望得到的结果是什么。

  1. 您可以在图像上使用自动方面

    ax.imshow(z, aspect="auto")
    

    enter image description here

  2. 或者您可以根据其轴限制设置线图的方面,使其与图像的大小相同(如果图像具有相等的x和y尺寸)

    asp = np.diff(ax2.get_xlim())[0] / np.diff(ax2.get_ylim())[0]
    ax2.set_aspect(asp)
    

    enter image description here 完整代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0,10,20)
    y = np.sin(x)
    z = np.random.rand(100,100)
    
    fig, (ax, ax2) = plt.subplots(ncols=2)
    
    ax.imshow(z)
    ax2.plot(x,y, marker=".")
    
    asp = np.diff(ax2.get_xlim())[0] / np.diff(ax2.get_ylim())[0]
    ax2.set_aspect(asp)
    
    plt.show()
    

    如果图像没有相同的限制(不是正方形),则仍然需要除以图像的方面:

    asp = np.diff(ax2.get_xlim())[0] / np.diff(ax2.get_ylim())[0]
    asp /= np.abs(np.diff(ax1.get_xlim())[0] / np.diff(ax1.get_ylim())[0])
    ax2.set_aspect(asp)
    

答案 1 :(得分:2)

对于那些在两个图中共享 y 轴的人,将 constrained_layout 设置为 True 可能会有所帮助。

答案 2 :(得分:1)

这是我使用的一些代码:

fig, axis_array = plt.subplots(1, 2, figsize=(chosen_value, 1.05 * chosen_value / 2),
                               subplot_kw={'aspect': 1})

我明确地选择在我的图中将有2个子图,并且该图将被选择为高值,并且每个子图的宽度大约是该图的一半,并且子图的宽高比将为1(即,它们都是正方形)。图形尺寸是强制间距的特定比率。

答案 3 :(得分:1)

我遇到了同样的问题,在SO中问了一个非常相似的问题。 @ImportanceOfBeingErnest提出的解决方案对我来说就像一个魅力,但为了完整起见,我想提一个我建议申请的简单解决方法(归功于@Yilun Zhang),然后我的问题被标记为完全重复这一个:

  

问题是绘图区域高度太大,这会在图像中留下空位

如果您将代码更改为:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
然后你得到了理想的结果:

Desired outcome