Matplotlib: соотношение сторон рамки

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Этот практикум проведет вас через процесс создания различных графиков с использованием метода set_box_aspect() в Matplotlib. Этот метод задает соотношение сторон между высотой и шириной осей в физических единицах, независимо от ограничений данных. Это полезно для создания квадратных графиков, независимо от данных, которые они содержат, или для создания обычного графика с одинаковыми размерами осей рядом с графиком изображения с фиксированным (данными-)соотношением сторон.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Квадратная ось, независимая от данных

Мы создадим квадратную ось, независимо от ограничений данных.

import matplotlib.pyplot as plt
import numpy as np

fig1, ax = plt.subplots()

ax.set_xlim(300, 400)
ax.set_box_aspect(1)

plt.show()

Общие квадратные оси

Мы создадим общие подграфики, которые имеют квадратный размер.

fig2, (ax, ax2) = plt.subplots(ncols=2, sharey=True)

ax.plot([1, 5], [0, 10])
ax2.plot([100, 500], [10, 15])

ax.set_box_aspect(1)
ax2.set_box_aspect(1)

plt.show()

Квадратные вторичные оси

Мы создадим квадратную ось с вторичными осями. Вторичные оси наследуют размер рамки родительской оси.

fig3, ax = plt.subplots()

ax2 = ax.twinx()

ax.plot([0, 10])
ax2.plot([12, 10])

ax.set_box_aspect(1)

plt.show()

Обычный график рядом с изображением

При создании графика изображения с фиксированным соотношением сторон данных и параметром по умолчанию adjustable="box" рядом с обычным графиком оси будут иметь разную высоту. set_box_aspect() предоставляет простое решение этой проблемы, позволяя обычным осям графика использовать размеры изображения в качестве соотношения сторон рамки. В этом примере также показано, что связанная компоновка взаимодействует хорошо с фиксированным соотношением сторон рамки.

fig4, (ax, ax2) = plt.subplots(ncols=2, layout="constrained")

np.random.seed(19680801)  ## Fixing random state for reproducibility
im = np.random.rand(16, 27)
ax.imshow(im)

ax2.plot([23, 45])
ax2.set_box_aspect(im.shape[0]/im.shape[1])

plt.show()

Квадратный совместный/маргинальный график

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

fig5, axs = plt.subplots(2, 2, sharex="col", sharey="row",
                         gridspec_kw=dict(height_ratios=[1, 3],
                                          width_ratios=[3, 1]))
axs[0, 1].set_visible(False)
axs[0, 0].set_box_aspect(1/3)
axs[1, 0].set_box_aspect(1)
axs[1, 1].set_box_aspect(3/1)

np.random.seed(19680801)  ## Fixing random state for reproducibility
x, y = np.random.randn(2, 400) * [[.5], [180]]
axs[1, 0].scatter(x, y)
axs[0, 0].hist(x)
axs[1, 1].hist(y, orientation="horizontal")

plt.show()

Соотношение сторон рамки для множества подграфиков

Можно передать соотношение сторон рамки оси при инициализации. Следующий код создает сетку из 2 на 3 подграфиков с квадратными осями.

fig7, axs = plt.subplots(2, 3, subplot_kw=dict(box_aspect=1),
                         sharex=True, sharey=True, layout="constrained")

for i, ax in enumerate(axs.flat):
    ax.scatter(i % 3, -((i // 3) - 0.5)*200, c=[plt.cm.hsv(i / 6)], s=300)
plt.show()

Резюме

В этом практическом занятии рассмотрено, как использовать set_box_aspect() в Matplotlib для создания различных типов графиков с фиксированным соотношением между высотой и шириной осей.