matplotlib Gridspe c Сюжеты неожиданного разного размера - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать сетку изображений с помощью matplotlib. Первая строка и столбец определяют входные данные для функции, а остальная часть сетки - выходные данные. Вот чье-то упоминание о том, как я бы хотел, чтобы это выглядело: ссылка .

Особенно обратите внимание, что строки отделяют первую строку и столбец от всего остального.

Я пытался за последние пару часов, чтобы заставить его работать. Лучшее, что я до сих пор сделал, - это использование Gridspe c, чтобы разделить изображение на четыре группы и построить изображение, используя 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')

Как вы можете видеть здесь , формы не совпадают, что делает сетку не выровненной. Любое решение, создающее изображение в стиле ссылки, было бы замечательно!

1 Ответ

0 голосов
/ 27 апреля 2020

Я бы использовал комбинацию GridSpec и GridSpecFromSubplotSpec для этого типа макета:

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)]

enter image description here

...