Визуализация данных позволяет преобразовать необработанные сырые данные в содержательные, осмысленные и более понятные визуальные образы. В экосистеме языка Python существует множество различных инструментов для визуализации данных, но самым популярным из них является библиотека Matplotlib. Эта библиотека предоставляет богатый набор инструментов для создания самых разнообразных статических, анимированных и интерактивных графиков и диаграмм: от простых линейных графиков до сложных 3D-графиков, позволяя разработчику настраивать под свои требования самые различные аспекты визуализации. Гибкость и возможности настройки Matplotlib делают эту библиотеку популярной среди разработчиков на языке Python и специалистов по анализу данных.
Для работы с Matplotlib нам естественно прежде всего надо установить эту библиотеку. Это можно с помощью менеджера пакетов pip с помощью команды:
pip install matplotlib
После завершения установки мы можем проверить, что все установлено корректно, выполнив в консоли команду, которая выводит версию matplotlib:
python -c "import matplotlib; print(matplotlib.__version__)"
Полный пример:
(myvenv) eugene@Eugene:/python/metanit$ pip install matplotlib Collecting matplotlib Downloading matplotlib-3.10.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB) Collecting contourpy>=1.0.1 (from matplotlib) Downloading contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.4 kB) Collecting cycler>=0.10 (from matplotlib) Downloading cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB) ..................................................................... Downloading six-1.17.0-py2.py3-none-any.whl (11 kB) Installing collected packages: six, pyparsing, pillow, packaging, kiwisolver, fonttools, cycler, contourpy, python-dateutil, matplotlib Successfully installed contourpy-1.3.1 cycler-0.12.1 fonttools-4.56.0 kiwisolver-1.4.8 matplotlib-3.10.8 packaging-24.2 pillow-11.1.0 pyparsing-3.2.1 python-dateutil-2.9.0.post0 six-1.17.0 (myvenv) eugene@Eugene:/python/metanit$ python -c "import matplotlib; print(matplotlib.__version__)" 3.10.8 (myvenv) eugene@Eugene:/python/metanit$
Основная функциональность (основные функции для создания графиков) библиотеки заключена в модуле matplotlib.pyplot, соответственно для создания графиков и диаграмм нам надо импортировать данный модуль:
import matplotlib.pyplot as plt
Каждый график Matplotlib, независимо от его сложности, имеет следующие основные компоненты:
Данные. В основе каждого графика лежат точки данных, которые надо визуализировать. Эти точки данных могут быть представлены в различных формах, таких как списки, массивы или данные, загруженные из внешних источников. Тип имеющихся данных влияет на выбор графика и способ его настройки.
Тип графика. Matplotlib предлагает множество типов графиков, включая линейные графики, столбчатые диаграммы, диаграммы рассеяния, гистограммы и другие. Выбор типа графика должен соответствовать характеру данных и цели визуализации.
Настройки. Matplotlib предоставляет обширные возможности настройки, позволяя адаптировать график к конкретным потребностям. Можно изменять различные аспекты графика, такие как цвета, маркеры, стили линий, метки, заголовки, свойства осей и многое другое. Такой уровень настройки позволяет создавать визуально привлекательные и информативные визуализации.
Отображение или сохранение. После создания графика его можно отобразить на экране или сохранить в файл в различных форматах (например, PNG и PDF) для последующего использования или обмена.
Теперь рассмотрим простейшей пример построения графика с помощью этой библиотеки. Для этого в текущем каталоге определим файл app.py со следующим кодом:
import matplotlib.pyplot as plt days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"] rates = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05] # Создание графика plt.plot(days, rates) plt.show()
Рассмотрим, что делает этот код. Здесь список days представляет дни месяца, а rates - курс доллара в эти дни. Таким образом, оба списка совпадают по количеству элементов.
Функция plot() принимает набор значений, которые надо вывести на графике. Так, в функцию plot() передаются два списка - сначала идет для отображения по оси X (здесь список days) и затем идет список для оси Y (здесь список rates). И c помощью функции show() отображаем график в окне просмотра по умолчанию.
Запустим этот скрипт на выполнение, и нам отобразится следующее окно с курсами валюты по дням:
Теперь рассмотрим основные компоненты, из которых состоит график, и управление этими компонентами.
Базовым компонентом графика в Matplotlib является рисунок или фигура (figure), которая представляет пространство (контейнер), где будут отображаться графики и диаграммы. Фигура отслеживает все дочерние оси графика, все его компоненты - заголовки, легенды, подписи и вложенные подфигуры.
Для создания фигуры можно использовать ряд функций. Прежде всего это фунция figure():
import matplotlib.pyplot as plt plt.figure() # создание фугуры
Для отрисовки фигуры применяется функция show():
import matplotlib.pyplot as plt plt.figure() # создание фугуры plt.show() # отрисовка фигуры
В итоге мы получим следующее окно:
Может возникнуть вопрос, почему же в самом первом примере с рисованием графика с помощью функции plt.plot() мы не создавали никаких фигур, но тем не менее окно с графиком у нас отрисовывалось как и должно.
Дело в том, что при первом вызове команды, связанной с построением графика (например, plt.plot()), библиотека Matplotlib проверяет наличие текущей активной фигуры. Если ее нет, библиотека автоматически создает новую фигуру.
Функция figure() принимает ряд параметров, которые позволяют настроить фигуру:
matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, *, facecolor=None, edgecolor=None, frameon=True, FigureClass=matplotlib.figure.Figure, clear=False, **kwargs)
Рассмотрим основные параметры:
num: уникальный идентификатор фигуры в виде целого числа или строки. Одновременно может существовать несколько фигур. И если фигура с таким идентификатором уже существует, она становится активной и возвращается.
Если же фигуры с таким идентификатором нет или num не указан, создается новая фигура, становится активной и возвращается.
figsize: задает размер фигуры в виде кортежа (float, float), который представляет значения ширины и высоты в дюймах (по умолчанию: [6.4, 4.8])
dpi: разрешение фигуры в точках на дюйм (по умолчанию: 100.0)
facecolor: цвет фона (по умолчанию: "white")
edgecolor: цвет границы (по умолчанию: "white")
frameon: настраивает рамку фигуры. Если False, отключается отрисовка рамки фигуры. По умолчанию True
FigureClass: тип фигуры. Если задано, будет создан экземпляр этого подкласса, а не обычная фигура.
clear: если True и фигура уже существует, то она очищается. По умолчанию: False
layout: задает компоновку элементов графика (меток, делений и т.д.). Может принимать следуюющие значения:
constrained: размеры осей корректируются, чтобы избежать перекрытия элементов оформления осей. Может обрабатывать сложные макеты графиков и цветовые шкалы, поэтому рекомендуется.
compressed: использует тот же алгоритм, что и constrained, но удаляет лишнее пространство между осями с фиксированным соотношением сторон. Лучше всего подходит для простых сеток осей.
tight: корректирует параметры подграфиков таким образом, чтобы элементы оформления не перекрывались.
none: механизм компоновки не используется.
Объект класса LayoutEngine: позволяет сторонним разработчикам предоставлять собственные механизмы компоновки.
Применим некоторые из этих параметров для настройки фигуры:
import matplotlib.pyplot as plt f_size=(2, 2) # размер фигуры f_color = "#59ABE3" # цвет фона f_header = "График" # заголовок f_layout = "constrained" # компоновка figure = plt.figure(f_header, figsize=f_size, facecolor=f_color, layout=f_layout) plt.show()
На каждом рисунке есть одна или несколько осей. Ось (axуs) в контексте Matplotlib представляет собой отдельный график или подграфик внутри фигуры в виде объекта Axes. Оси предоставляют пространство, где можно визуализировать данные, устанавливать системы координат и применять различные настройки с помощью методов типа Axes.
Для создания одного набора осей на графике можно использовать функцию subplots():
import matplotlib.pyplot as plt figure, axes = plt.subplots() print(figure) # Figure(640x480) print(axes) # Axes(0.125,0.11;0.775x0.77) plt.show()
Причем функция subplots() возвращает сразу и фигуру (figure), и собственно оси (объект Axes), благодаря чему мы можем настраивать оба аспекта приложения. В итоге окно отобразит фигуру с нарисованными осями:
Для создания графика у объекта Axes применяется функция plot():
plot(*args, scalex=True, scaley=True, data=None, **kwargs)
Через первый параметр - args передаются значения для осей графика. Если передаются два набора данных, то первый набор представляет значения для оси X и второй набор - значения для оси Y. Можно также передать только один набор данных -
только для оси Y. Дополнительные параметры:
scalex и scaley определяют, будет ли график масштабироваться
data представляет объект с данными для имен меток для построения графика по осям x и y.
Например, построим простейший график:
import matplotlib.pyplot as plt days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"] rates = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05] figure, axes = plt.subplots() # Построение графика axes.plot(days, rates) plt.show()
Здесь список days, который представляет дни месяца, проецируется на ось X, а список rates (валютный курс по дням) - на ось Y.
Стоит отметить, что в самом первом примере мы не создавали явным образом оси:
import matplotlib.pyplot as plt days = ["31.01", "03.02", "04.02", "05.02", "06.02", "07.02"] rates = [75.73, 77.02, 76.98, 76.91, 76.55, 77.05] # Создание графика plt.plot(days, rates) plt.show()
Дело в том, что в данном случае наряду с автоматическим созданием фигуры библиотека также автоматически генерирует объект Axes и привязывает к этому объекту данные (переменные days и rates). В итоге мы получим тот же самый результат.
Выше мы рассмотрели по сути два типа создания графика - по сути два типа интерфейса:
Интерфейс объекта Axes (объектно-ориентированный, явный)
Сначала создаеся объект Figure и один или несколько объектов Axes, затем с помощью методов этих объектов добавляются данных, настраиваются границы, устанавливаются меток и т.д.
Интерфейс модуля pyplot (функциональный, неявный)
Представляет применение функций модуля pyplot. Управление графиком и осями осуществляется с помощью этих функций, и они присутствуют в фоновом режиме лишь неявно.
Но оба интерфейса фактически используют аналогичные функции, которые обычно совпадают по названию и имеют одинаковые параметры. Например, построение графика с помощью методов объекта Axes:
fig, axes = plt.subplots()
axes.plot(x, y)
axes.set_title("График") # заголовок
plt.show()
И аналогичный пример в функциональном стиле:
plt.plot(x, y)
plt.title("График") # заголовок
plt.show()