Как создать подзаголовки python imshow с одинаковым размером пикселя

Я пытаюсь создать подзаголовки imshow с одинаковым размером пикселя без автоматического масштабирования высоты фигуры, но я не смог понять, как это сделать.

В идеале я ищу сюжет, похожий на второе изображение, без лишних пробелов (ylim изменяется от -0,5 до 4,5) и, возможно, по центру по вертикали. Мои изображения всегда будут иметь одинаковую ширину, поэтому, возможно, если бы я мог исправить ширину подзаголовка вместо высоты, это помогло бы. У кого-нибудь есть какие-либо идеи?

close('all')
f,ax=subplots(1,2)
ax[0].imshow(random.rand(30,4),interpolation='nearest')
ax[1].imshow(random.rand(4,4),interpolation='nearest')
tight_layout()

f,ax=subplots(1,2)
ax[0].imshow(random.rand(30,4),interpolation='nearest')
ax[1].imshow(random.rand(4,4),interpolation='nearest')
ax[1].set_ylim((29.5,-0.5))
tight_layout()

График без корректировки ylim:

График без настройки ylim

График с корректировкой ylim:

График с настройкой ylim


person broccoli008    schedule 16.11.2018    source источник


Ответы (1)


В принципе, вы можете просто сделать размер фигуры достаточно маленьким по ширине, чтобы он ограничивал ширину подграфиков. Например. figsize=(2,7) будет работать здесь.

Для автоматизированного решения вы можете настроить параметры подграфика таким образом, чтобы левое и правое поля ограничивали ширину подграфика. Это показано в коде ниже. Предполагается, что имеется одна строка подграфиков и все изображения имеют одинаковое количество пикселей в горизонтальном направлении.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1,2)
im1 = ax[0].imshow(np.random.rand(30,4))
im2 = ax[1].imshow(np.random.rand(4,4))


def adjustw(images, wspace="auto"):
    fig = images[0].axes.figure
    if wspace=="auto":
        wspace = fig.subplotpars.wspace
    top = fig.subplotpars.top
    bottom = fig.subplotpars.bottom
    shapes = np.array([im.get_array().shape for im in images])
    w,h = fig.get_size_inches()
    imw = (top-bottom)*h/shapes[:,0].max()*shapes[0,1] #inch
    n = len(shapes)
    left = -((n+(n-1)*wspace)*imw/w - 1)/2.
    right = 1.-left
    fig.subplots_adjust(left=left, right=right, wspace=wspace)

adjustw([im1, im2], wspace=1)

plt.show()

Если вам нужно использовать tight_layout(), сделайте это перед вызовом функции. Кроме того, вам определенно нужно установить единственный свободный параметр здесь, wspace, на что-то отличное от "auto". wspace=1 означает, что расстояние между графиками равно их ширине.

Результатом является фигура, в которой подграфики имеют одинаковый размер по ширине.

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 16.11.2018
comment
Есть ли у вас идеи о том, как это будет изменено при использовании фигурки другого размера? Например, изменение третьей строки на fig, ax = plt.subplots(1,2,figsize=(40,30)) создает подграфики с пикселями разного размера. - person broccoli008; 19.11.2018
comment
Пиксели на обоих подграфиках одинаковы, независимо от размера фигуры. Я подозреваю, что если вы используете figsize=(40,30) и не меняете dpi, это приведет к тому, что цифра будет слишком большой для вашего экрана, и в этом случае окно фигуры будет уменьшено до размера экрана, и все правильно рассчитанные значения станут недействительными. - person ImportanceOfBeingErnest; 20.11.2018