Как изменить размер фигуры в Matplotlib: полное руководство

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

Почему важно контролировать размер фигуры?

Размер фигуры напрямую влияет на визуальное восприятие графика. Слишком маленькая фигура может сделать детали неразличимыми, а слишком большая — привести к неэффективному использованию пространства. Контроль над размером позволяет:

  • Оптимизировать читаемость: Обеспечить достаточно места для элементов графика, таких как метки осей, легенды и сами данные.
  • Адаптировать для разных целей: Создавать графики, подходящие для печати, веб-страниц, презентаций и т.д.
  • Улучшить эстетику: Достичь баланса и пропорциональности в визуальном представлении данных.

Основы: Что такое Figure и Axes?

В Matplotlib необходимо различать два ключевых понятия:

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

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

Изменение размера фигуры при создании

Использование figsize при создании фигуры

Самый распространенный способ задать размер фигуры — использовать аргумент figsize при создании объекта Figure с помощью функции plt.figure() или plt.subplots():

import matplotlib.pyplot as plt
from typing import Tuple

def create_figure(figsize: Tuple[float, float] = (8, 6)) -> plt.Figure:
    """Создает новую фигуру с заданным размером.

    Args:
        figsize: Кортеж, содержащий ширину и высоту фигуры в дюймах.

    Returns:
        Объект Figure.
    """
    fig = plt.figure(figsize=figsize)
    return fig

# Пример использования
fig = create_figure(figsize=(10, 8))  # Ширина 10 дюймов, высота 8 дюймов
plt.show()

Размеры в дюймах: Понимание единиц измерения

Значения в figsize указываются в дюймах. Это важно учитывать, так как конечный размер графика на экране или при печати будет зависеть от разрешения (DPI – dots per inch).

Примеры: Создание фигур разных размеров

import matplotlib.pyplot as plt
from typing import Tuple

def create_scatter_plot(figsize: Tuple[float, float], data_x: list[float], data_y: list[float], title: str) -> None:
    """Создает точечный график с заданными размерами и данными."""
    fig, ax = plt.subplots(figsize=figsize)
    ax.scatter(data_x, data_y)
    ax.set_title(title)
    plt.show()

# Пример 1: Квадратная фигура
data_x = [1, 2, 3, 4, 5]
data_y = [2, 4, 1, 3, 5]
create_scatter_plot(figsize=(6, 6), data_x = data_x, data_y = data_y, title = "Квадратный график")

# Пример 2: Широкая фигура
create_scatter_plot(figsize=(12, 4), data_x = data_x, data_y = data_y, title = "Широкий график")

# Пример 3: Высокая фигура
create_scatter_plot(figsize=(4, 12), data_x = data_x, data_y = data_y, title = "Высокий график")

Изменение размера существующей фигуры

Метод figure.set_size_inches()

Если фигура уже создана, изменить ее размер можно с помощью метода set_size_inches() объекта Figure:

import matplotlib.pyplot as plt
from typing import Tuple

def resize_existing_figure(fig: plt.Figure, figsize: Tuple[float, float]) -> None:
    """Изменяет размер существующей фигуры.

    Args:
        fig: Объект Figure, размер которого нужно изменить.
        figsize: Кортеж, содержащий новую ширину и высоту фигуры в дюймах.
    """
    fig.set_size_inches(figsize)
    plt.show()

# Пример использования
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 2])
resize_existing_figure(fig, (10, 6))

Изменение размеров после отрисовки: Влияние на визуализацию

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

Реклама

Сохранение изменений: Обновление визуализации

После изменения размера фигуры необходимо обновить визуализацию, чтобы изменения отобразились. Обычно это происходит автоматически при интерактивном использовании Matplotlib. Если вы работаете в неинтерактивной среде, может потребоваться вызов plt.draw() или fig.canvas.draw().

Продвинутые методы контроля размеров

Влияние dpi на размер и разрешение

Параметр dpi (dots per inch) определяет количество точек на дюйм, используемых для отображения фигуры. Более высокое значение dpi приводит к более четкому и детальному изображению, но увеличивает размер файла. dpi можно задать при создании фигуры или при сохранении:

import matplotlib.pyplot as plt

# Задание DPI при создании фигуры
fig = plt.figure(figsize=(8, 6), dpi=100)
plt.plot([1, 2, 3], [4, 5, 2])
plt.show()

# Задание DPI при сохранении фигуры
plt.savefig("my_plot.png", dpi=300)

Управление соотношением сторон (aspect ratio)

Соотношение сторон (aspect ratio) определяет пропорции ширины и высоты Axes. Matplotlib автоматически устанавливает разумное соотношение сторон, но его можно изменить с помощью методов ax.set_aspect() или plt.axis('equal').

Размеры фигуры и размещение элементов (subplots, legends)

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

Оптимизация размеров для различных целей (печать, веб)

  • Для печати: Используйте высокое значение dpi (например, 300) и выбирайте размеры, соответствующие размеру страницы.
  • Для веб: Используйте более низкое значение dpi (например, 72 или 96) и оптимизируйте размер файла.

Практические примеры и советы

Пример 1: Создание широкоформатной фигуры для презентации

import matplotlib.pyplot as plt
import numpy as np

# Создание данных для графика
x = np.linspace(0, 10, 100)
y = np.sin(x)

# Создание широкоформатной фигуры
fig, ax = plt.subplots(figsize=(16, 6))

# Построение графика
ax.plot(x, y)

# Настройка заголовка и меток осей
ax.set_title("Синусоида", fontsize=20)
ax.set_xlabel("X", fontsize=16)
ax.set_ylabel("Y", fontsize=16)

# Настройка размера шрифта для меток на осях
ax.tick_params(axis='both', which='major', labelsize=14)

# Отображение сетки
ax.grid(True)

# Сохранение фигуры
plt.savefig("presentation_plot.png", dpi=150)

plt.show()

Пример 2: Создание компактной фигуры для встраивания в веб-страницу

import matplotlib.pyplot as plt
import numpy as np

# Создание данных для графика
x = np.linspace(0, 5, 50)
y = x**2

# Создание компактной фигуры
fig, ax = plt.subplots(figsize=(6, 4))

# Построение графика
ax.plot(x, y)

# Настройка заголовка и меток осей
ax.set_title("Парабола", fontsize=12)
ax.set_xlabel("X", fontsize=10)
ax.set_ylabel("Y", fontsize=10)

# Уменьшение размера шрифта для меток на осях
ax.tick_params(axis='both', which='major', labelsize=8)

# Сохранение фигуры
plt.savefig("web_plot.png", dpi=72)

plt.show()

Советы по выбору оптимального размера фигуры

  • Начните с разумного размера (например, 8×6 дюймов) и корректируйте его в зависимости от сложности графика и целевой аудитории.
  • Учитывайте разрешение (DPI). Более высокое разрешение требует большего размера фигуры.
  • Используйте plt.tight_layout() для автоматической оптимизации размещения элементов.
  • Экспериментируйте с разными размерами, чтобы найти оптимальный баланс между читаемостью и эстетикой.

Распространенные ошибки и способы их избежать

  • Слишком маленький размер: Данные плохо различимы. Решение: увеличьте размер фигуры.
  • Слишком большой размер: Неэффективное использование пространства. Решение: уменьшите размер фигуры.
  • Игнорирование DPI: Несоответствие между размером фигуры и разрешением. Решение: задайте dpi при создании или сохранении фигуры.
  • Неправильное соотношение сторон: График выглядит искаженным. Решение: используйте ax.set_aspect() или plt.axis('equal').

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