Как заставить один и тот же размер между осями изображения Matplotlib subplot - PullRequest
0 голосов
/ 11 мая 2018

Предположим, у меня есть следующий код для создания трех параллельных изображений:

    n=10
    x = np.random.rand(n,1)
    y = np.random.rand(1,n)
    z = np.random.rand(n,n)

    fig, ax = plt.subplots(1, 3)
    ax[0].imshow(x)
    ax[1].imshow(z)
    ax[2].imshow(y)

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

enter image description here

Есть ли способ программно заставить все размеры изображения размером n выглядеть одинаково на трех графиках, независимо от окнаразмер?Я ищу способ связать оси или изображения таким образом, чтобы вертикальная ось первого графика была такого же размера, как вертикальная ось второго графика, а горизонтальная ось третьего графика была бы такой же, какгоризонтальная ось второго графика, независимо от размера окна.то есть как то так: enter image description here

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

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

fig, ax = plt.subplots(1, 3, figsize=(6.4,3))
fig.subplots_adjust(bottom=0.26, top=0.74)

plot

0 голосов
/ 11 мая 2018

Я думаю, что самый простой способ - использовать aspect='auto' с ax[1].imshow(z).Но это приведет к искажению изображения, которое может отличаться от того, что вы показали в вопросе.И это может не сработать в тех случаях, когда нет единого n.Я не уверен, что получил 100%, но позвольте мне попробовать этот метод.Ключевая идея здесь:

  1. Изменить соотношение сторон вашего fig.Точное соотношение зависит как от данных вашего изображения, так и от макета вашего вспомогательного участка.
  2. Используйте плотный макет для устранения ненужных между осями, которые могут немного сместить ваш график.

Вот мой примеркод и рисунок:

import matplotlib.pyplot as plt
from matplotlib.figure import figaspect
import numpy as np

n = 10
x = np.random.rand(n,1)
y = np.random.rand(1,n)
z = np.random.rand(n,n)

width_max = max(s.shape[0] for s in [x, y, z])
height_max = max(s.shape[1] for s in [x, y, z])

row = 1
col = 3
fig, ax = plt.subplots(row, col)
w, h = figaspect(row*width_max/(col*height_max))
fig.set_size_inches(w, h)

ax[0].imshow(x)
ax[1].imshow(z)
ax[2].imshow(y)

plt.tight_layout()
plt.show()

enter image description here

Надеюсь, это решит вашу реальную проблему.Я думаю, что это также работает для случая, как:

x = np.random.rand(3,1)
y = np.random.rand(1,10)
z = np.random.rand(7,6)
...