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

Dav*_*idG 18 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()
Run Code Online (Sandbox Code Playgroud)

这给出了下图:

在此输入图像描述

我怎样才能让这两个sublpots具有相同的高度?(和我想的宽度)

我已经尝试使用gridspec如图这个答案:

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

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

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

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

有没有办法制作imshow并且scatter图形在图中看起来大小相同而无需手动更改轴尺寸?

我使用的是Python 2.7和matplotlib 2.0.0

Imp*_*est 22

目前还不完全清楚你期望的结果是什么.

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

    ax.imshow(z, aspect="auto")
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

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

    asp = np.diff(ax2.get_xlim())[0] / np.diff(ax2.get_ylim())[0]
    ax2.set_aspect(asp)
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述 完整代码:

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

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

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