如何在 matplotlib 子图图像轴之间强制相同大小

Posted

技术标签:

【中文标题】如何在 matplotlib 子图图像轴之间强制相同大小【英文标题】:How to force same size between matplotlib subplot image axes 【发布时间】:2018-10-22 05:22:43 【问题描述】:

假设我有以下代码来创建三个并排的图像:

    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)

但是,坐标区会自动缩放,因此第一个图像中的垂直轴大于第二个图像中的垂直轴。

有没有办法以编程方式强制所有尺寸为n 的图像尺寸在三个图中看起来相同,而不管窗口大小如何?我正在寻找一种方法来链接轴或图像,以便第一个图的垂直轴与第二个图的垂直轴大小相同,第三个图的水平轴与第二个图的水平轴,与窗口大小无关。即是这样的:

【问题讨论】:

【参考方案1】:

我认为一种最简单的方法是将aspect='auto'ax[1].imshow(z) 一起使用。但这会以一种可能与您在问题中显示的不同的方式扭曲图像。它可能不适用于没有单个n 的情况。我不确定我是否能 100% 得到你,但让我试试这个方法。这里的关键思想是:

    更改fig 的纵横比。确切的比例来自您的图像数据和子图布局。 使用紧凑的布局来消除轴之间的不必要的可能会稍微偏移您的图表。

这是我的示例代码和图:

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 对不起,我不熟悉你在说什么。你是什​​么“生成的图形窗口”?我已经用 Jupyter notebook 测试了代码。无论我如何更改 Chrome 窗口的大小,它都保持不变。如果我用fig.savefig('test.png') 保存图形也可以。如果觉得图太大,可以相应缩小wh。默认情况下,它基于您的rcParams['figure.figsize'][1]【参考方案2】:

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

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

【讨论】:

以上是关于如何在 matplotlib 子图图像轴之间强制相同大小的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib - 断轴示例:不均匀的子图大小

Python seaborn可视化:组合多个seaborn可视化结果并使得组合结果图像共享Y轴使用matplotlib的subplots子图函数的gridspec_kw参数指定子图的相对大小或者比率

如何为多图布局调整 Matplotlib/Seaborn 子图之间的空间

使用共享 x 轴合并 matplotlib 子图

Python matplotlib之函数图像绘制、线条rc参数设置

Matplotlib:获取子图以填充图形