如何在Matplotlib中使用ImageGrid调整子图大小

4 投票
1 回答
4572 浏览
提问于 2025-04-18 01:42

我正在用Python和Matplotlib制作一个图形,这个图形里有两个子图,每个子图里都有一组图表,并且它们共享一个颜色条。我几乎把所有的东西都搞定了。唯一我搞不定的就是如何让上面的子图和下面的子图宽度一致,也就是说,4x2的网格加上颜色条的宽度要和2x1的网格加上颜色条的宽度相同。下面左边的图像形状和其他图表不一样,这是我故意设计的。

这是我写的代码:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import AxesGrid, ImageGrid
from numpy.random import rand

fig = plt.figure(1)

grid1 = ImageGrid(fig, 211,
                nrows_ncols = (2, 4),
                axes_pad = 0.07,
                share_all=True,
                label_mode = "L",
                cbar_location = "right",
                cbar_mode="single",
                cbar_size="7%",
                cbar_pad="7%",
                aspect = True
                )

for n in range(8):
    im = grid1[n].imshow(rand(10,10),interpolation="nearest")

grid1.axes_all

cb1 = grid1.cbar_axes[0].colorbar(im)
cb1.set_label_text('subfig 1')

grid2 = ImageGrid(fig, 212,
                nrows_ncols = (1, 2),
                axes_pad = 0.1,
                label_mode = "L",
                share_all = False,
                cbar_location="right",
                cbar_mode="single",
                cbar_size="7%",
                cbar_pad="7%",
                aspect = True
                )

im = grid2[0].imshow(rand(10,15),interpolation="nearest")
im = grid2[1].imshow(rand(10,10),interpolation="nearest")

cb2 = grid2.cbar_axes[0].colorbar(im)
cb2.set_label_text('subfig 2')

plt.figtext(0.05,0.85,'(a)',size=20)
plt.figtext(0.05,0.45,'(b)',size=20)

plt.show()

这是我得到的结果:

result

实际的图表是图像,所以保持每个图像的正确比例非常重要。

我觉得缺少的一步是获取每个子图的坐标轴(不是子子图的坐标轴),但我不知道该怎么做。

我看过文档,也查看了matplotlib.org上的示例。有一些示例展示了如何调整单个grid[n]的大小,但我找不到任何示例说明如何调整grid的大小。有没有人能给我一些建议?

1 个回答

1

对我来说,指定一个图形的大小很有帮助:

fig = plt.figure(1, (6., 6.))

我还需要改变文字的位置:

plt.figtext(0.0,0.85,'(a)',size=20)
plt.figtext(0.0,0.45,'(b)',size=20)

结果:

看起来它保持了比例

撰写回答