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