matplotlib Gridspec子图意外大小不同

yc0p9oo0  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(145)

我正在尝试使用matplotlib创建一个图像网格。第一行和第一列定义函数的输入,网格的其余部分是输出。
以下是其他人对我希望它看起来如何的参考:reference
特别要注意的是,第一行和第一列与其他所有行和列之间的分隔线。
我在过去的几个小时里一直在努力使它工作,到目前为止我做得最好的是使用Gridspec将图像分成四组,并使用PIL构建图像。
然而,由于某种原因,我无法理解不同子情节的形状不匹配。
附加一个最小的代码和它的输出。

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import PIL

f = plt.figure(figsize=(20, 20))

resolution = 256
num_images = 6
h = w = num_images
main_grid = gridspec.GridSpec(h, w, hspace=0, wspace=0)

col = f.add_subplot(main_grid[0, 1:])
row = f.add_subplot(main_grid[1:, 0])
mid = f.add_subplot(main_grid[1:, 1:])
corner = f.add_subplot(main_grid[0, 0])

corner_canvas = PIL.Image.new('RGB', (resolution, resolution), 'gray')
mid_canvas = PIL.Image.new('RGB', (resolution * w, resolution * h), 'yellow')
col_canvas = PIL.Image.new('RGB', (resolution * w, resolution), 'blue')
row_canvas = PIL.Image.new('RGB', (resolution, resolution * h), 'red')

corner.imshow(corner_canvas)
col.imshow(col_canvas)
row.imshow(row_canvas)
mid.imshow(mid_canvas)

plt.savefig('fig.png')

如您所见,形状不匹配,这使得网格不对齐。

krcsximq

krcsximq1#

我将使用GridSpecGridSpecFromSubplotSpec的组合来实现这种布局:

Nx = 2
Ny = 3
sp = 0.5

fig = plt.figure()
gs0 = matplotlib.gridspec.GridSpec(2,2, width_ratios=[1,Nx+1], height_ratios=[1,Ny+1], wspace=sp, hspace=sp, figure=fig)
gs00 = matplotlib.gridspec.GridSpecFromSubplotSpec(1,Nx,subplot_spec=gs0[0,1:], wspace=0, hspace=0)
gs01 = matplotlib.gridspec.GridSpecFromSubplotSpec(Ny,1,subplot_spec=gs0[1:,0], wspace=0, hspace=0)
gs11 = matplotlib.gridspec.GridSpecFromSubplotSpec(Ny,Nx, subplot_spec=gs0[1:,1:], wspace=0, hspace=0)


top_axes = [fig.add_subplot(gs00[i]) for i in range(Nx)]
left_axes = [fig.add_subplot(gs01[i]) for i in range(Ny)]
center_axes = [fig.add_subplot(gs11[j,i]) for j in range(Ny) for i in range(Nx)]

相关问题