Matplotlib: Как отобразить два графика на одном?

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

Зачем отображать несколько графиков на одном?

Отображение нескольких графиков на одном позволяет:

  • Сравнивать данные: Визуально сопоставлять тренды и закономерности.
  • Экономить место: Эффективно использовать доступное пространство для отображения информации.
  • Подчеркивать взаимосвязи: Показывать, как различные наборы данных влияют друг на друга.
  • Создавать комплексные визуализации: Объединять различные типы графиков для более полного представления данных.

Обзор различных способов отображения графиков

Существует несколько способов отображения нескольких графиков в Matplotlib, каждый из которых подходит для разных сценариев:

  • pyplot.plot(): Простейший способ, позволяющий рисовать несколько линий на одной оси координат.
  • subplot(): Создает сетку подграфиков на одной фигуре, предоставляя больше контроля над расположением графиков.
  • add_subplot() и add_axes(): Обеспечивают максимальную гибкость в размещении графиков, позволяя создавать сложные компоновки.
  • twinx() и twiny(): Позволяют отображать данные с разными масштабами на одной оси, создавая двойные оси.

Использование pyplot.plot() для отображения нескольких графиков

pyplot.plot() – самый простой способ нарисовать несколько графиков на одной оси. Просто вызовите plot() несколько раз перед вызовом show().

Простой пример отображения двух линий

import matplotlib.pyplot as plt
from typing import List, Tuple

def plot_two_lines(x_data: List[float], y1_data: List[float], y2_data: List[float], title: str, x_label: str, y_label: str) -> None:
    """Plots two lines on the same plot.

    Args:
        x_data: List of x values.
        y1_data: List of y values for the first line.
        y2_data: List of y values for the second line.
        title: Title of the plot.
        x_label: Label for the x-axis.
        y_label: Label for the y-axis.
    """
    plt.plot(x_data, y1_data, label='Линия 1')
    plt.plot(x_data, y2_data, label='Линия 2')
    plt.xlabel(x_label)
    plt.ylabel(y_label)
    plt.title(title)
    plt.legend()
    plt.show()

# Пример использования
x = [1, 2, 3, 4, 5]
y1 = [2, 3, 5, 7, 11]
y2 = [1, 4, 9, 16, 25]

plot_two_lines(x, y1, y2, 'Два графика на одном', 'X', 'Y')

Добавление легенды для различения графиков

Чтобы различать графики, используйте аргумент label в функции plot() и вызовите plt.legend() для отображения легенды.

Настройка стилей линий и цветов

Matplotlib позволяет настраивать стили линий (например, сплошная, пунктирная), цвета и маркеры для каждого графика. Используйте аргументы linestyle, color и marker в функции plot():

import matplotlib.pyplot as plt
from typing import List

def plot_styled_lines(x_data: List[float], y1_data: List[float], y2_data: List[float], title: str, x_label: str, y_label: str) -> None:
    """Plots two lines with different styles on the same plot.

    Args:
        x_data: List of x values.
        y1_data: List of y values for the first line.
        y2_data: List of y values for the second line.
        title: Title of the plot.
        x_label: Label for the x-axis.
        y_label: Label for the y-axis.
    """
    plt.plot(x_data, y1_data, label='Линия 1', linestyle='--', color='red', marker='o')
    plt.plot(x_data, y2_data, label='Линия 2', linestyle='-', color='blue', marker='x')
    plt.xlabel(x_label)
    plt.ylabel(y_label)
    plt.title(title)
    plt.legend()
    plt.show()

# Пример использования
x = [1, 2, 3, 4, 5]
y1 = [2, 3, 5, 7, 11]
y2 = [1, 4, 9, 16, 25]

plot_styled_lines(x, y1, y2, 'Стилизованные линии', 'X', 'Y')

Использование subplot() для создания нескольких графиков на одной фигуре

subplot() позволяет создавать несколько подграфиков, организованных в сетку, на одной фигуре.

Основы использования subplot()

Функция subplot() принимает три аргумента: количество строк, количество столбцов и индекс подграфика (начиная с 1).

Реклама
import matplotlib.pyplot as plt

def create_subplots(data1: list[float], data2: list[float]) -> None:
    """Creates two subplots in a 1x2 grid.
    Args:
        data1 (list[float]): Data for the first subplot.
        data2 (list[float]): Data for the second subplot.
    """
    plt.figure(figsize=(10, 5))

    plt.subplot(1, 2, 1)  # 1 строка, 2 столбца, первый подграфик
    plt.plot(data1)
    plt.title('Первый график')

    plt.subplot(1, 2, 2)  # 1 строка, 2 столбца, второй подграфик
    plt.plot(data2)
    plt.title('Второй график')

    plt.tight_layout()  # Автоматическая корректировка расположения графиков
    plt.show()

#Example usage
data_1 = [1, 2, 3, 4, 5]
data_2 = [5, 4, 3, 2, 1]
create_subplots(data_1, data_2)

Создание сетки графиков (2×1, 1×2, 2×2)

import matplotlib.pyplot as plt

def create_grid_subplots() -> None:
    """Creates a 2x2 grid of subplots with dummy data."""
    plt.figure(figsize=(8, 6))

    plt.subplot(2, 2, 1)
    plt.plot([1, 2, 3], [4, 5, 6])
    plt.title('2x2 - Подграфик 1')

    plt.subplot(2, 2, 2)
    plt.plot([3, 2, 1], [6, 5, 4])
    plt.title('2x2 - Подграфик 2')

    plt.subplot(2, 2, 3)
    plt.plot([1, 3, 2], [4, 6, 5])
    plt.title('2x2 - Подграфик 3')

    plt.subplot(2, 2, 4)
    plt.plot([2, 1, 3], [5, 4, 6])
    plt.title('2x2 - Подграфик 4')

    plt.tight_layout()
    plt.show()

create_grid_subplots()

Совместное использование осей (sharex, sharey)

Аргументы sharex и sharey позволяют связать оси подграфиков, чтобы при изменении масштаба одного подграфика масштабировались и другие.

Настройка интервалов между графиками

Функция plt.tight_layout() автоматически корректирует интервалы между подграфиками, чтобы избежать перекрытия. Также можно использовать plt.subplots_adjust() для ручной настройки параметров.

Использование add_subplot() и add_axes() для более гибкого контроля

add_subplot() и add_axes() предоставляют еще больше контроля над расположением и размером графиков.

Отличия add_subplot() от subplot()

add_subplot() – это метод объекта Figure, а не функция pyplot. Он ведет себя аналогично subplot(), но требует явного указания объекта Figure.

Использование add_axes() для произвольного размещения графиков

add_axes() позволяет добавить оси в произвольном месте фигуры, указав координаты и размеры в относительных единицах (от 0 до 1).

import matplotlib.pyplot as plt

def create_custom_axes_plot(x_data: list[float], y_data: list[float]) -> None:
    """Creates a plot with custom axes placement."""
    fig = plt.figure()

    # Основной график
    ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8])  # left, bottom, width, height (в долях от размера фигуры)
    ax1.plot(x_data, y_data)
    ax1.set_xlabel('X')
    ax1.set_ylabel('Y')
    ax1.set_title('Основной график')

    # Вложенный график
    ax2 = fig.add_axes([0.6, 0.6, 0.25, 0.25])  # left, bottom, width, height
    ax2.plot(x_data, y_data[::-1], color='red')
    ax2.set_title('Вложенный график')

    plt.show()

x = [1, 2, 3, 4, 5]
y = [2, 4, 1, 3, 5]
create_custom_axes_plot(x, y)

Примеры создания сложных компоновок

Используя add_axes(), можно создавать сложные визуализации с наложением графиков, вложенными графиками и нестандартным расположением элементов.

Продвинутые техники и советы

Использование twinx() и twiny() для отображения разных масштабов по осям

twinx() и twiny() позволяют создать вторую ось, общую по x или y, соответственно. Это полезно для отображения данных с разными масштабами на одном графике.

import matplotlib.pyplot as plt

def plot_with_twinx(x_data: list[float], y1_data: list[float], y2_data: list[float], label1: str, label2: str) -> None:
    """Plots two datasets with different scales using twinx."""
    fig, ax1 = plt.subplots()

    ax2 = ax1.twinx()
    ax1.plot(x_data, y1_data, 'g-', label=label1)
    ax2.plot(x_data, y2_data, 'b-', label=label2)

    ax1.set_xlabel('X данные')
    ax1.set_ylabel(label1, color='g')
    ax2.set_ylabel(label2, color='b')

    ax1.tick_params(axis='y', labelcolor='g')
    ax2.tick_params(axis='y', labelcolor='b')

    fig.tight_layout()
    plt.title('График с twinx')
    plt.show()

x = [1, 2, 3, 4, 5]
y1 = [10, 20, 30, 40, 50]
y2 = [1, 4, 9, 16, 25]
plot_with_twinx(x, y1, y2, 'Данные 1', 'Данные 2')

Оптимизация отображения для удобочитаемости

  • Используйте четкие метки осей и заголовки.
  • Добавляйте легенды для различения графиков.
  • Выбирайте подходящие цвета и стили линий.
  • Регулируйте интервалы между графиками.
  • Избегайте перегрузки графика излишней информацией.

Обработка перекрытия графиков

Если графики перекрываются, можно использовать следующие приемы:

  • Изменить прозрачность графиков (аргумент alpha в функции plot()).
  • Использовать разные стили линий или маркеры.
  • Разместить графики на разных подграфиках.
  • Масштабировать графики так, чтобы они не перекрывались.

Добавить комментарий