Длина оси шкалы Matplotlib должна быть равна - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть 2 сюжета:

plt.subplot(1, 2, 1)
plt.plot(x, y)
plt.subplot(1, 2, 2)
plt.plot(u, v)

Диапазон u и v равен [0,1] для обоих, диапазон x и y является случайным, и x отличается от y. Я хотел бы сделать оба подплота в квадрате, поэтому длина оси х должна быть равна длине оси у. Для второго подпункта легко использовать другой вопрос SO:

plt.subplot(1, 2, 1)
plt.plot(x, y)
plt.subplot(1, 2, 2)
plt.plot(u, v)
plt.axis('scaled')

Однако этот метод не работает для первого подзадача, он уменьшает масштаб оси Y до чего-то действительно малого, поскольку значения находятся в небольшом диапазоне, в то время как ось x в основном находится в диапазоне [0,1], поэтому он имеет такое же масштабирование, как и второй подзаговор

Как я могу масштабировать ось Y первого подпункта так, чтобы она равнялась длине других осей?

Ответы [ 2 ]

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

Вы хотите, чтобы ваши подсюжеты были в квадрате. Функция plt.axis принимает 'square' в качестве параметра, и это действительно означает его: она сделает квадраты текущих осей как в пикселях, так и в единицах данных.

x = np.arange(2)
y = x / 3
u = v = [0, 1]

plt.subplot(121)
plt.plot(x, y)
plt.axis('square')

plt.subplot(122)
plt.plot(u, v)
plt.axis('square')

enter image description here

К сожалению, это расширит пределы оси Y далеко за пределы диапазона данных Y, а это не то, что вам нужно. То, что вам нужно, это соотношение сторон субплота, чтобы быть обратным соотношению диапазонов данных. AFAIK нет никакой удобной функции или метода для этого, но вы можете написать свой собственный.

def make_square_axes(ax):
    """Make an axes square in screen units.

    Should be called after plotting.
    """
    ax.set_aspect(1 / ax.get_data_ratio())

plt.subplot(121)
plt.plot(x, y)
make_square_axes(plt.gca())

plt.subplot(122)
plt.plot(u, v)
make_square_axes(plt.gca())

enter image description here

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

Так как вам нужна равная ось, вы должны установить plt.axis('equal') вместо 'scaled'. Фактически, даже для второго сценария ключевое слово 'equal' должно использоваться для получения квадратной цифры

x = np.linspace(1, 0.1, 10)
y = np.linspace(1, 1, 10)
fig, ax = plt.subplots(figsize=(5, 5))
ax.plot(x, y, '.')
ax.axis('equal')
plt.show()

Square plot with equal aspect ratio

Обратите внимание, что установка figsize в (length, length) дает фактический квадрат, в противном случае используется размер фигуры по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...