Рисование фигур с помощью виджетов Matplotlib

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

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

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

Введение

В этом практическом занятии мы научимся использовать виджеты RectangleSelector и EllipseSelector в Matplotlib для рисования прямоугольника или эллипса от начальной точки клика до текущей позиции мыши.

Советы по использованию ВМ

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

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

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

Импортируем необходимые библиотеки

Начнем с импорта необходимых библиотек: Matplotlib, Numpy и виджетов RectangleSelector и EllipseSelector.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import EllipseSelector, RectangleSelector

Определяем функцию обратного вызова выбора

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

def select_callback(eclick, erelease):
    """
    Callback for line selection.

    *eclick* and *erelease* are the press and release events.
    """
    x1, y1 = eclick.xdata, eclick.ydata
    x2, y2 = erelease.xdata, erelease.ydata
    print(f"({x1:3.2f}, {y1:3.2f}) --> ({x2:3.2f}, {y2:3.2f})")
    print(f"The buttons you used were: {eclick.button} {erelease.button}")

Определяем функцию переключения селектора

Функция переключения селектора будет вызываться каждый раз, когда пользователь нажимает клавишу 't'. Эта функция будет переключать активный статус виджетов RectangleSelector и EllipseSelector.

def toggle_selector(event):
    print('Key pressed.')
    if event.key == 't':
        for selector in selectors:
            name = type(selector).__name__
            if selector.active:
                print(f'{name} deactivated.')
                selector.set_active(False)
            else:
                print(f'{name} activated.')
                selector.set_active(True)

Создаем фигуру и подграфики

Мы создадим фигуру с двумя подграфиками, один для RectangleSelector и другой для EllipseSelector.

fig = plt.figure(layout='constrained')
axs = fig.subplots(2)

Построим что-то на подграфиках

Мы построим что-то на подграфиках, чтобы пользователь мог увидеть эффект работы RectangleSelector и EllipseSelector.

N = 100000  ## Если N велико, можно увидеть улучшение при использовании blitting.
x = np.linspace(0, 10, N)

for ax in axs:
    ax.plot(x, np.sin(2*np.pi*x))  ## построим что-то

Создаем виджеты RectangleSelector и EllipseSelector

Мы создадим виджеты RectangleSelector и EllipseSelector и добавим их на подграфики.

selectors = []
for ax, selector_class in zip(axs, [RectangleSelector, EllipseSelector]):
    ax.set_title(f"Click and drag to draw a {selector_class.__name__}.")
    selectors.append(selector_class(
        ax, select_callback,
        useblit=True,
        button=[1, 3],  ## disable middle button
        minspanx=5, minspany=5,
        spancoords='pixels',
        interactive=True))
    fig.canvas.mpl_connect('key_press_event', toggle_selector)
axs[0].set_title("Press 't' to toggle the selectors on and off.\n"
                 + axs[0].get_title())

Показываем график

Наконец, мы покажем график пользователю.

plt.show()

Резюме

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