Наложение изображения на график Matplotlib

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

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Вы узнаете, как использовать метод figimage из класса matplotlib.figure.Figure для позиционирования изображения на графике и метод imread из модуля matplotlib.image для загрузки данных изображения.

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

Советы по виртуальной машине

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

click-notebook
Иногда вам может понадобиться подождать несколько секунд, пока Jupyter Notebook загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если у вас возникнут проблемы во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL matplotlib(("Matplotlib")) -.-> matplotlib/PlottingDataGroup(["Plotting Data"]) matplotlib(("Matplotlib")) -.-> matplotlib/PlotCustomizationGroup(["Plot Customization"]) matplotlib(("Matplotlib")) -.-> matplotlib/BasicConceptsGroup(["Basic Concepts"]) matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("Importing Matplotlib") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("Understanding Figures and Axes") matplotlib/PlottingDataGroup -.-> matplotlib/line_plots("Line Plots") matplotlib/PlottingDataGroup -.-> matplotlib/scatter_plots("Scatter Plots") matplotlib/PlottingDataGroup -.-> matplotlib/bar_charts("Bar Charts") matplotlib/PlotCustomizationGroup -.-> matplotlib/titles_labels("Adding Titles and Labels") matplotlib/PlotCustomizationGroup -.-> matplotlib/axis_ticks("Axis Ticks Customization") subgraph Lab Skills matplotlib/importing_matplotlib -.-> lab-49029{{"Наложение изображения на график Matplotlib"}} matplotlib/figures_axes -.-> lab-49029{{"Наложение изображения на график Matplotlib"}} matplotlib/line_plots -.-> lab-49029{{"Наложение изображения на график Matplotlib"}} matplotlib/scatter_plots -.-> lab-49029{{"Наложение изображения на график Matplotlib"}} matplotlib/bar_charts -.-> lab-49029{{"Наложение изображения на график Matplotlib"}} matplotlib/titles_labels -.-> lab-49029{{"Наложение изображения на график Matplotlib"}} matplotlib/axis_ticks -.-> lab-49029{{"Наложение изображения на график Matplotlib"}} end

Создание Jupyter Notebook и импорт необходимых библиотек

В первой ячейке вашего ноутбука введите следующий код для импорта необходимых библиотек:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook
import matplotlib.image as image

Поймем, что делает каждая из этих библиотек:

  • matplotlib.pyplot (с псевдонимом plt): Набор функций, которые делают matplotlib похожим на MATLAB, предоставляя удобный интерфейс для создания графиков.
  • numpy (с псевдонимом np): Основной пакет для научных вычислений в Python, который мы будем использовать для манипуляции данными.
  • matplotlib.cbook: Набор вспомогательных функций для matplotlib, включая функции для получения примеров данных.
  • matplotlib.image: Модуль для работы с изображениями в matplotlib, который мы будем использовать для чтения и отображения изображений.

Запустите ячейку, нажав кнопку "Run" в верхней части ноутбука или нажав Shift+Enter.

libraries-imported

Выполнение этой ячейки должно завершиться без вывода, что означает, что все библиотеки были успешно импортированы.

Загрузка и изучение изображения

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

  1. Создайте новую ячейку в своем ноутбуке и введите следующий код:
## Load the sample image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Display information about the image
print(f"Image shape: {im.shape}")
print(f"Image data type: {im.dtype}")

## Display the image
plt.figure(figsize=(4, 4))
plt.imshow(im)
plt.axis('off')  ## Hide axis
plt.title('Matplotlib Logo')
plt.show()

Этот код выполняет следующие действия:

  • Использует cbook.get_sample_data(), чтобы загрузить образец изображения с именем 'logo2.png' из коллекции примеров данных Matplotlib.
  • Использует image.imread(), чтобы прочитать файл изображения в массив NumPy.
  • Выводит информацию о размерах изображения и типе данных.
  • Создает фигуру и отображает изображение с помощью plt.imshow().
  • Скрывает деления и метки осей с помощью plt.axis('off').
  • Добавляет заголовок к фигуре.
  • Отображает фигуру с помощью plt.show().
  1. Запустите ячейку, нажав Shift+Enter.

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

image-info

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

Создание базового графика с случайными данными

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

  1. Создайте новую ячейку в своем ноутбуке и введите следующий код:
## Create a figure and axes for our plot
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)  ## x-axis values (0 to 29)
y = x + np.random.randn(30)  ## y-axis values (x plus random noise)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')  ## Green bars

## Add grid lines
ax.grid(linestyle='--', alpha=0.7)

## Add labels and title
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Random Data')

## Display the plot
plt.tight_layout()
plt.show()

Этот код выполняет следующие действия:

  • Создает фигуру и оси определенного размера с использованием plt.subplots().
  • Устанавливает случайное зерно (seed), чтобы каждый раз при запуске кода получать одни и те же случайные значения.
  • Генерирует 30 значений по оси x (от 0 до 29) и соответствующие значения по оси y (x плюс случайный шум).
  • Создает столбчатую диаграмму с зелеными столбцами с использованием ax.bar().
  • Добавляет сетку на график с помощью ax.grid().
  • Добавляет подписи для осей x и y, а также заголовок для графика.
  • Использует plt.tight_layout() для корректировки интервалов между элементами для более красивого вида.
  • Отображает график с помощью plt.show().
  1. Запустите ячейку, нажав Shift+Enter.

В выводе должна отобразиться столбчатая диаграмма с зелеными столбцами, представляющими случайные данные. По оси x отображаются целые числа от 0 до 29, а по оси y - соответствующие значения с добавленным случайным шумом.

Этот график станет основой, на которую мы наложим изображение на следующем шаге. Обратите внимание, что мы сохранили объект фигуры в переменной fig, а объект осей - в переменной ax. Эти переменные нам понадобятся для добавления наложения изображения.

Наложение изображения на график

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

  1. Создайте новую ячейку в своем ноутбуке и введите следующий код:
## Create a figure and axes for our plot (same as before)
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)  ## x-axis values (0 to 29)
y = x + np.random.randn(30)  ## y-axis values (x plus random noise)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')  ## Green bars

## Add grid lines
ax.grid(linestyle='--', alpha=0.7)

## Add labels and title
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Image Overlay')

## Load the image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Overlay the image on the plot
## Parameters:
## - im: the image data
## - 25, 25: x and y position in pixels from the bottom left
## - zorder=3: controls the drawing order (higher numbers are drawn on top)
## - alpha=0.5: controls the transparency (0 = transparent, 1 = opaque)
fig.figimage(im, 25, 25, zorder=3, alpha=0.5)

## Display the plot
plt.tight_layout()
plt.show()

Этот код объединяет действия, выполненные на предыдущих шагах, и добавляет метод figimage для наложения изображения на график. Вот разбор параметров метода figimage:

  • im: Данные изображения в виде массива NumPy.
  • 25, 25: Координаты x и y в пикселях от нижнего левого угла фигуры.
  • zorder = 3: Управляет порядком рисования. Более высокие значения рисуются поверх элементов с более низкими значениями.
  • alpha = 0.5: Управляет прозрачностью изображения. Значение 0 означает полную прозрачность, а 1 - полную непрозрачность.
  1. Запустите ячейку, нажав Shift+Enter.

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

  1. Давайте поэкспериментируем с разными положениями и уровнями прозрачности. Создайте новую ячейку и введите следующий код:
## Create a figure and axes for our plot
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data
x = np.arange(30)
y = x + np.random.randn(30)

## Create a bar chart
bars = ax.bar(x, y, color='#6bbc6b')
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Bar Chart with Centered Image Overlay')

## Load the image
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)

## Get figure dimensions
fig_width, fig_height = fig.get_size_inches() * fig.dpi

## Calculate center position (this is approximate)
x_center = fig_width / 2 - im.shape[1] / 2
y_center = fig_height / 2 - im.shape[0] / 2

## Overlay the image at the center with higher transparency
fig.figimage(im, x_center, y_center, zorder=3, alpha=0.3)

## Display the plot
plt.tight_layout()
plt.show()

Этот код размещает изображение в центре фигуры с более высоким уровнем прозрачности (alpha = 0.3), что делает его более подходящим в качестве водяного знака.

  1. Запустите ячейку, нажав Shift+Enter.

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

Создание переиспользуемой функции для наложения изображений

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

  1. Создайте новую ячейку в своем ноутбуке и введите следующий код:
def add_image_overlay(fig, image_path, x_pos=25, y_pos=25, alpha=0.5, zorder=3):
    """
    Add an image overlay to a matplotlib figure.

    Parameters:
    -----------
    fig : matplotlib.figure.Figure
        The figure to add the image to
    image_path : str
        Path to the image file
    x_pos : int
        X position in pixels from the bottom left
    y_pos : int
        Y position in pixels from the bottom left
    alpha : float
        Transparency level (0 to 1)
    zorder : int
        Drawing order (higher numbers are drawn on top)

    Returns:
    --------
    fig : matplotlib.figure.Figure
        The figure with the image overlay
    """
    ## Load the image
    with cbook.get_sample_data(image_path) as file:
        im = image.imread(file)

    ## Add the image to the figure
    fig.figimage(im, x_pos, y_pos, zorder=zorder, alpha=alpha)

    return fig

## Example usage: Create a scatter plot with an image overlay
fig, ax = plt.subplots(figsize=(10, 6))

## Set a random seed for reproducibility
np.random.seed(19680801)

## Generate random data for a scatter plot
x = np.random.rand(50) * 10
y = np.random.rand(50) * 10

## Create a scatter plot
ax.scatter(x, y, s=100, c=np.random.rand(50), cmap='viridis', alpha=0.7)
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Scatter Plot with Image Overlay')

## Add the image overlay using our function
add_image_overlay(fig, 'logo2.png', x_pos=50, y_pos=50, alpha=0.4)

## Display the plot
plt.tight_layout()
plt.show()

Этот код определяет функцию add_image_overlay, которая:

  • Принимает параметры для фигуры, пути к изображению, позиции, прозрачности и z-порядка.
  • Загружает указанное изображение.
  • Добавляет изображение на фигуру с использованием figimage.
  • Возвращает модифицированную фигуру.

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

  1. Запустите ячейку, нажав Shift+Enter.

В выводе должна отобразиться точечная диаграмма с случайно расположенными и окрашенными точками, а также логотип Matplotlib, наложенный в позиции (50, 50) с прозрачностью 40%.

  1. Попробуем еще один пример с линейным графиком. Создайте новую ячейку и введите следующий код:
## Example usage: Create a line plot with an image overlay
fig, ax = plt.subplots(figsize=(10, 6))

## Generate data for a line plot
x = np.linspace(0, 10, 100)
y = np.sin(x)

## Create a line plot
ax.plot(x, y, linewidth=2, color='#d62728')
ax.grid(linestyle='--', alpha=0.7)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Sine Wave with Image Overlay')
ax.set_ylim(-1.5, 1.5)

## Add the image overlay using our function
## Place it in the bottom right corner
fig_width, fig_height = fig.get_size_inches() * fig.dpi
with cbook.get_sample_data('logo2.png') as file:
    im = image.imread(file)
    x_pos = fig_width - im.shape[1] - 50  ## 50 pixels from the right edge

add_image_overlay(fig, 'logo2.png', x_pos=x_pos, y_pos=50, alpha=0.6)

## Display the plot
plt.tight_layout()
plt.show()

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

  1. Запустите ячейку, нажав Shift+Enter.

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

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

Резюме

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

  1. Импорт библиотек: Мы начали с импорта необходимых библиотек для работы с графиками и изображениями в Matplotlib.

  2. Загрузка и анализ изображений: Мы научились загружать изображения с помощью функции imread и изучать их свойства.

  3. Создание базовых графиков: Мы создали различные типы графиков (столбчатые диаграммы, точечные диаграммы и линейные графики), которые будут служить основой для наложения изображений.

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

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

Навыки, которые вы освоили в этом руководстве, можно применить для:

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

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