Создание подграфиков Matplotlib

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

Введение

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

Наиболее распространенный способ создания подграфиков — использование функции plt.subplots(). Эта функция создает рисунок и сетку подграфиков одним вызовом, возвращая объект Figure и массив объектов Axes, которые представляют каждый отдельный подграфик.

В этой лабораторной работе вы научитесь:

  • Создавать рисунок, содержащий несколько подграфиков.
  • Строить данные на конкретных подграфиках.
  • Регулировать компоновку, чтобы предотвратить наложение графиков.
  • Обмениваться осями между подграфиками для более четких сравнений.

Вы будете писать и выполнять скрипты Python в WebIDE. Поскольку эта среда не поддерживает интерактивные окна GUI, вы будете сохранять свои графики в виде файлов изображений и просматривать их непосредственно в редакторе.

Создание рисунка и осей с помощью plt.subplots()

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

Мы будем использовать функцию plt.subplots(). Когда вы вызываете plt.subplots(nrows, ncols), она возвращает два элемента:

  1. Объект Figure, который представляет собой общее окно или страницу, на которой все отрисовывается. Обычно мы присваиваем его переменной с именем fig.
  2. Массив объектов Axes. Каждый объект Axes представляет один из подграфиков в сетке. Вы можете получить к ним доступ по их индексу. Для сетки (1, 2) мы можем распаковать этот массив в две переменные, ax1 и ax2.

Давайте напишем код. Откройте файл main.py в файловом проводнике слева и добавьте следующее содержимое. Этот скрипт импортирует необходимые библиотеки, создает рисунок с двумя подграфиками и сохраняет его в файл изображения с именем plot1.png.

import matplotlib.pyplot as plt
import numpy as np

## Create a figure and a set of subplots.
## 1 row, 2 columns.
fig, (ax1, ax2) = plt.subplots(1, 2)

## Save the figure to a file.
## The file will be created in the /home/labex/project directory.
plt.savefig('plot1.png')

print("Figure saved as plot1.png")

Теперь запустите скрипт из терминала, чтобы сгенерировать график.

python3 main.py

В терминале вы должны увидеть следующий вывод:

Figure saved as plot1.png

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

Plot1

Построение графика на первом подграфике с помощью ax1.plot()

На этом этапе вы научитесь рисовать график на одном из созданных вами объектов Axes. Каждый объект Axes имеет свои собственные методы для построения графиков, такие как plot(), bar(), scatter() и т. д., которые аналогичны функциям основного интерфейса plt.

Мы построим простую синусоиду на первом подграфике, который представлен переменной ax1. Мы также добавим заголовок к этому подграфику с помощью метода set_title().

Обновите файл main.py следующим кодом. Мы добавляем генерацию данных с помощью NumPy, а затем строим их на ax1.

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y)
ax1.set_title('Sine Wave')

## Save the figure to a new file
plt.savefig('plot2.png')

print("Figure saved as plot2.png")

Теперь выполните обновленный скрипт в терминале.

python3 main.py

Вы увидите следующий вывод:

Figure saved as plot2.png

Новый файл plot2.png теперь находится в вашем каталоге проекта. Откройте его, чтобы увидеть результат. Левый подграфик теперь должен содержать график синусоиды, в то время как правый останется пустым.

Plot2

Построение графика на втором подграфике с помощью ax2.plot()

На этом этапе вы завершите создание рисунка, добавив график на второй подграфик. Процесс идентичен предыдущему шагу, но на этот раз вы вызовете метод plot() для объекта ax2.

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

Измените файл main.py, чтобы добавить построение графика на второй оси.

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Save the figure to a new file
plt.savefig('plot3.png')

print("Figure saved as plot3.png")

В приведенном выше коде мы добавили 'tab:orange' в вызов ax2.plot(), чтобы изменить цвет линии, делая графики визуально различимыми.

Запустите скрипт снова из терминала.

python3 main.py

Вывод будет следующим:

Figure saved as plot3.png

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

Plot3

Настройка расположения подграфиков с помощью plt.tight_layout()

На этом шаге вы научитесь автоматически корректировать расстояние между подграфиками, чтобы заголовки и подписи не перекрывались. Matplotlib предоставляет для этого простую функцию: plt.tight_layout().

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

Добавим plt.tight_layout() в наш скрипт. Обновите main.py следующим образом:

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Adjust layout to prevent overlap
plt.tight_layout()

## Save the figure to a new file
plt.savefig('plot4.png')

print("Figure saved as plot4.png")

Единственное изменение — добавление строки plt.tight_layout(). Теперь запустите скрипт.

python3 main.py

Вывод:

Figure saved as plot4.png

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

Plot4

Общие оси с помощью sharex=True или sharey=True

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

Вы можете включить общий доступ к осям, передав аргументы sharex=True или sharey=True в plt.subplots().

Чтобы продемонстрировать это, давайте создадим новый скрипт. Создайте файл с именем shared_axes.py в каталоге вашего проекта и добавьте следующий код. Этот пример создаст два подграфика, расположенных вертикально (nrows=2, ncols=1), которые имеют общий x-ось.

import matplotlib.pyplot as plt
import numpy as np

## Create data
t = np.arange(0.01, 5.0, 0.01)
s1 = np.exp(t)
s2 = np.sin(2 * np.pi * t)

## Create a figure and two subplots that share the x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

## Plot on the first subplot
ax1.plot(t, s1, 'tab:blue')
ax1.set_ylabel('Exponential')

## Plot on the second subplot
ax2.plot(t, s2, 'tab:orange')
ax2.set_ylabel('Sinusoidal')
ax2.set_xlabel('time (s)')

## Adjust layout
plt.tight_layout()

## Save the figure
plt.savefig('plot5.png')

print("Figure saved as plot5.png")

Теперь запустите этот новый скрипт из терминала.

python3 shared_axes.py

Вывод:

Figure saved as plot5.png

Откройте plot5.png. Обратите внимание, что метки делений по оси x присутствуют только на нижнем подграфике (ax2). Это связано с тем, что sharex=True автоматически скрывает метки внутренних осей x для создания более чистого вида. Оба графика идеально выровнены по оси x, что облегчает их сравнение.

Plot5

Резюме

Поздравляем с завершением лабораторной работы! Вы освоили основные методы создания и управления подграфиками в Matplotlib.

В этой лабораторной работе вы практиковались в:

  • Использовании plt.subplots() для создания рисунка с сеткой подграфиков.
  • Доступе к отдельным объектам Axes и использовании их методов для построения данных.
  • Добавлении заголовков к конкретным подграфикам.
  • Использовании plt.tight_layout() для автоматической корректировки интервалов и предотвращения перекрытия элементов.
  • Создании подграфиков с общими осями с помощью sharex=True для более четкого сравнения данных и более аккуратного рисунка.

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