$ sudo teach IT

Файл для практики.

month,sales,profit,orders,customers
1,12000,3000,120,25
2,14500,3900,145,27
3,16800,4700,172,33
4,15500,4300,160,31
5,21500,6800,235,46
6,23800,7600,260,51
7,25200,8200,275,55
8,24100,7800,268,53
9,28600,9400,325,64
10,27800,9100,315,61
11,32400,10800,370,73
12,35800,12300,425,84

В предыдущих уроках мы строили графики с помощью функций вроде plot(), bar() и hist(). Для большинства простых задач этого достаточно. Однако по мере усложнения визуализаций возникает множество вопросов.

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

Для решения подобных задач важно понимать, как устроен Matplotlib внутри. Несмотря на большое количество функций, библиотека построена вокруг нескольких ключевых объектов. Именно они отвечают за создание холста, отображение графиков и настройку их внешнего вида.

В этом уроке мы познакомимся с объектной моделью Matplotlib, разберем объекты Figure и Axes, научимся изменять размеры графиков и управлять диапазонами отображаемых данных.

Что вы узнаете в рамках статьи

  • Что такое объектная модель Matplotlib.
  • Для чего нужны объекты Figure и Axes.
  • Как создавать графики через объектный подход.
  • Как изменять размеры визуализаций.
  • Как управлять диапазонами осей.
  • Когда полезно ограничивать отображаемые данные.
  • Как улучшать читаемость графиков с помощью размеров и масштабирования.

Ключевые термины

  • Объектная модель — способ организации библиотеки через взаимодействующие объекты.
  • Figure — весь холст, содержащий один или несколько графиков.
  • Axes — область внутри Figure, где строится конкретный график.
  • Диапазон оси — границы отображаемых значений на оси.
  • Масштабирование — изменение видимой части данных на графике.

Почему Matplotlib использует объекты

До этого момента мы использовали код примерно такого вида:

import matplotlib.pyplot as plt

days = ["Пн", "Вт", "Ср", "Чт", "Пт"]
temperature = [18, 21, 24, 22, 19]

plt.plot(days, temperature)

plt.show()

Такой подход очень удобен для простых задач. Однако представьте, что вам нужно создать отчет с несколькими графиками, разными размерами, собственными подписями и настройками осей. В этом случае становится гораздо удобнее работать через объекты. Именно поэтому внутри Matplotlib существует объектная модель.

Что такое Figure

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

Создадим пустой Figure:

import matplotlib.pyplot as plt

fig = plt.figure()

plt.show()

После запуска появится пустое окно. Графика пока нет, потому что мы создали только сам холст.

Что такое Axes

Если Figure — это лист бумаги, то Axes — это конкретная область на листе, где строится график. Именно объект Axes отвечает за содержимое графика. Внутри него располагаются оси X и Y, строятся линии и столбцы, отображаются подписи, легенды и другие элементы оформления. Проще говоря, именно Axes является той областью, в которой Matplotlib непосредственно рисует данные.

Создание Figure и Axes

Чаще всего оба объекта создаются одновременно. Для этого используется функция fig, ax = plt.subplots().

Рассмотрим пример.

import matplotlib.pyplot as plt

days = ["Пн", "Вт", "Ср", "Чт", "Пт"]
temperature = [18, 21, 24, 22, 19]

fig, ax = plt.subplots()

ax.plot(days, temperature)

plt.show()

Здесь fig содержит весь холст, а ax представляет конкретный график. На практике именно такой стиль написания кода чаще всего встречается в документации и профессиональных проектах.

Изменение размеров графика

Иногда график получается слишком маленьким. Особенно это заметно, когда подписи длинные.

Представим рейтинг фильмов:

movies = [
    "Interstellar",
    "Inception",
    "The Matrix",
    "Dune",
    "Avatar"
]

При стандартном размере подписи могут располагаться слишком близко друг к другу.

В таких ситуациях помогает параметр figsize.

import matplotlib.pyplot as plt

movies = [
    "Interstellar",
    "Inception",
    "The Matrix",
    "Dune",
    "Avatar"
]

ratings = [8.7, 8.8, 8.6, 8.1, 7.9]

fig, ax = plt.subplots(
    figsize=(10, 4)
)

ax.bar(movies, ratings)

plt.show()

Теперь график становится заметно шире. Подписи легче читаются, а сама визуализация выглядит аккуратнее.

Что означает figsize

Параметр состоит из двух чисел figsize=(10, 4). Первое число задает ширину. Второе — высоту. Увеличивая эти значения, можно получать более крупные изображения. Например figsize=(12, 6) создаст заметно больший график.

Когда стоит менять размер

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

Создание нескольких графиков через subplots()

В прошлом уроке мы использовали функцию subplot(), которая позволяла размещать несколько графиков на одном холсте. Однако в объектном подходе для этой задачи чаще используют функцию subplots(). Ее преимущество заключается в том, что она сразу создает объект Figure и набор объектов Axes, с которыми удобно работать дальше.

Например, создадим два графика рядом.

import matplotlib.pyplot as plt

fig, axes = plt.subplots(
    nrows=1,
    ncols=2,
    figsize=(10, 4)
)

plt.show()

Здесь:

  • nrows — количество строк;
  • ncols — количество столбцов.

В результате будет создан один Figure и два объекта Axes.

Теперь каждый график можно настраивать отдельно.

import matplotlib.pyplot as plt

days = ["Пн", "Вт", "Ср", "Чт", "Пт"]

temperature = [18, 21, 24, 22, 19]
humidity = [55, 60, 58, 65, 62]

fig, axes = plt.subplots(
    nrows=1,
    ncols=2,
    figsize=(10, 4)
)

axes[0].plot(days, temperature)
axes[0].set_title("Температура")

axes[1].plot(days, humidity)
axes[1].set_title("Влажность")

plt.tight_layout()
plt.show()

В данном примере:

  • axes[0] управляет первым графиком;
  • axes[1] управляет вторым графиком.

Каждый объект Axes имеет собственные подписи, заголовки, оси и настройки. Если графиков больше, Matplotlib возвращает массив объектов Axes.

Например:

fig, axes = plt.subplots(
    nrows=2,
    ncols=2
)

создаст четыре области для построения графиков. Именно поэтому объектный подход считается более удобным для сложных визуализаций. Вместо постоянного переключения между областями через subplot() мы получаем прямой доступ к каждому графику через соответствующий объект Axes.

Ограничение диапазонов осей

По умолчанию Matplotlib показывает весь диапазон данных. Но иногда нас интересует только определенный участок.

Например, график скорости автомобиля:

minutes = [0, 1, 2, 3, 4, 5]
speed = [20, 35, 60, 80, 85, 90]

Мы можем приблизить только высокие скорости. Для этого используется ax.set_ylim().

Полный пример:

import matplotlib.pyplot as plt

minutes = [0, 1, 2, 3, 4, 5]
speed = [20, 35, 60, 80, 85, 90]

fig, ax = plt.subplots()

ax.plot(minutes, speed)

ax.set_ylim(50, 100)

plt.show()

Теперь отображается только диапазон от 50 до 100. Получается своеобразное приближение интересующей части данных.

Ограничение диапазона по оси X

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

import matplotlib.pyplot as plt

months = list(range(1, 13))

prices = [
    100000,
    102000,
    103500,
    105000,
    107000,
    109000,
    110000,
    111500,
    113000,
    115000,
    116000,
    118000
]

fig, ax = plt.subplots()

ax.plot(months, prices)

ax.set_xlim(7, 12)

plt.show()

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

Когда полезно ограничивать диапазоны

Представьте, что вы анализируете посещаемость сайта. Большинство дней находятся в диапазоне от 900 до 1200 посетителей. Но однажды произошел рекламный запуск и посещаемость выросла до 10000. Автоматическое масштабирование может сделать обычные дни практически неразличимыми. В такой ситуации ограничение диапазона помогает подробнее изучить интересующий участок данных.

Осторожно с масштабированием

Изменение диапазонов — мощный инструмент. Но пользоваться им нужно аккуратно. Слишком узкие границы могут создать ложное впечатление о данных.

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

Наиболее частые ошибки

  • Путать Figure и Axes
    Figure представляет весь холст, а Axes отдельный график.
  • Использовать слишком маленький figsize
    Подписи начинают накладываться друг на друга.
  • Забывать менять размеры при большом количестве данных
    График становится плохо читаемым.
  • Слишком сильно ограничивать диапазоны осей
    Данные могут восприниматься неправильно.
  • Игнорировать объектный подход
    Он значительно упрощает работу со сложными визуализациями.

Наиболее частые вопросы

  • Обязательно ли использовать Figure и Axes?
    Нет, но это наиболее гибкий подход.
  • Чем отличается plt.plot() от ax.plot()?
    Первый вариант использует глобальный интерфейс, второй работает с конкретным объектом Axes.
  • Что означает figsize=(10, 4)?
    Ширина графика составляет 10 дюймов, высота — 4 дюйма.
  • Можно ли менять диапазоны после построения графика?
    Да, через методы set_xlim() и set_ylim().
  • Когда ограничение диапазона полезно?
    Когда необходимо подробнее изучить конкретную часть данных.

Итоги

В этом уроке вы познакомились с объектной моделью Matplotlib и узнали, как устроена библиотека внутри. Мы разобрали роли объектов Figure и Axes, научились создавать графики через объектный подход, изменять размеры визуализаций и управлять диапазонами отображаемых данных.

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

На следующий урок