Как создать подсюжеты Python imshow с одинаковым размером пикселя - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь создать сюжеты 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()

Участок без регулировки яркости:

Plot without ylim adjustment

Участок с регулировкой яркости:

Plot with ylim adjustment

1 Ответ

0 голосов
/ 17 ноября 2018

В принципе, вы можете просто сделать размер фигуры достаточно маленьким по ширине, чтобы он ограничивал ширину вспомогательных участков.Например, 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 означает, что между графиками должно быть столько же места, сколько и их ширина.

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

enter image description here

...