如何强制使matplotlib子图图像轴的大小相同?

8
假设我有以下代码来创建三个并排的图片:
    n=10
    x = np.random.rand(n,1)
    y = np.random.rand(1,n)
    z = np.random.rand(n,n)

    fig, ax = plt.subplots(1, 3)
    ax[0].imshow(x)
    ax[1].imshow(z)
    ax[2].imshow(y)

然而,轴自动缩放,使得第一张图片中的垂直轴比第二张图片中的垂直轴更大。

enter image description here

有没有一种编程方式可以强制所有尺寸为n的图像在三个绘图中看起来相同,无论窗口大小如何?我正在寻找一种方法,要么链接轴,要么链接图像,以便第一个图的垂直轴与第二个图的垂直轴大小相同,第三个图的水平轴与第二个图的水平轴大小相同,无论窗口大小如何。例如: enter image description here
2个回答

2
我认为最简单的方法是在 ax[1].imshow(z) 中使用 aspect='auto'。但这种方式可能会扭曲图像,与你在问题中展示的不同。而且,在没有单个 n 的情况下可能无法工作。我不确定我是否完全理解你的意思,但让我尝试一下这种方法。关键思路如下:
  1. 更改您的 fig 的纵横比。确切的比例来自于您的图像数据和子图布局。
  2. 使用紧凑布局消除不必要的轴之间的空隙,这可能会稍微偏移您的图形。
以下是我的示例代码和图像:
import matplotlib.pyplot as plt
from matplotlib.figure import figaspect
import numpy as np

n = 10
x = np.random.rand(n,1)
y = np.random.rand(1,n)
z = np.random.rand(n,n)

width_max = max(s.shape[0] for s in [x, y, z])
height_max = max(s.shape[1] for s in [x, y, z])

row = 1
col = 3
fig, ax = plt.subplots(row, col)
w, h = figaspect(row*width_max/(col*height_max))
fig.set_size_inches(w, h)

ax[0].imshow(x)
ax[1].imshow(z)
ax[2].imshow(y)

plt.tight_layout()
plt.show()

在此输入图片描述

我希望这可以解决你的实际问题。我认为这也适用于以下情况:

x = np.random.rand(3,1)
y = np.random.rand(1,10)
z = np.random.rand(7,6)

这个不太行:对于大的 n,生成的图形窗口非常大,调整窗口大小会再次改变比例。我正在寻找一种方法,可以链接坐标轴或图像,以便无论窗口大小如何,相对尺寸保持不变。(为了澄清,将此添加到原始问题中) - dkv
@dkv 对不起,我不熟悉你所说的内容。你所谓的“生成的图形窗口”是什么?我已经在Jupyter笔记本上测试了代码。无论我如何改变Chrome窗口的大小,它都保持不变。如果使用fig.savefig('test.png')保存图像也没有问题。如果你觉得图像太大,可以相应地缩小wh。默认情况下,它基于你的rcParams['figure.figsize'][1] - Y. Luo

0

您可以限制图形大小和/或子图参数在垂直方向上,以留出较少的空间来缩放轴。

fig, ax = plt.subplots(1, 3, figsize=(6.4,3))
fig.subplots_adjust(bottom=0.26, top=0.74)

plot


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