Инструменты и интерактивные функции Matplotlib
Справочная документация Matplotlib
Этот набор функций обеспечивает обработку событий, операции со свойствами, взаимодействие с мышью и инструменты отладки.
Обзор функций
| Функция | Описание |
|---|---|
| connect() | Привязать функцию обратного вызова события |
| disconnect() | Отвязать функцию обратного вызова события |
| ginput() | Получение координат по щелчку мыши |
| waitforbuttonpress() | Ожидать нажатия мыши или клавиатуры |
| findobj() | Найти Artist, соответствующий условиям |
| get() / setp() | Получить/установить свойства Artist |
| getp() | Получить свойства Artist (псевдоним для get) |
| get_current_fig_manager() | Получить текущий менеджер Figure |
| new_figure_manager() | Создать менеджер для Figure |
| set_loglevel() | Установить уровень логирования |
| xkcd() | Переключиться на рукописный комиксный стиль xkcd |
Обработка событий — connect() / disconnect()
matplotlib.pyplot.connect(s, func) matplotlib.pyplot.disconnect(cid)
Пример
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(np.random.randn(50).cumsum())
ax.set_title('Щёлкните в любом месте на графике')
# Обратный вызов события щелчка
def on_click(event):
print(f'Клик в: x={event.xdata:.2f}, y={event.ydata:.2f}')
# Привязать событие
cid = fig.canvas.mpl_connect('button_press_event', on_click)
plt.show()
print("пример: события кликов зарегистрированы")
import numpy as np
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(np.random.randn(50).cumsum())
ax.set_title('Щёлкните в любом месте на графике')
# Обратный вызов события щелчка
def on_click(event):
print(f'Клик в: x={event.xdata:.2f}, y={event.ydata:.2f}')
# Привязать событие
cid = fig.canvas.mpl_connect('button_press_event', on_click)
plt.show()
print("пример: события кликов зарегистрированы")
ginput() - Выбор координат мышью
matplotlib.pyplot.ginput(n=1, timeout=30, show_clicks=True,
mouse_add=MouseButton.LEFT, mouse_pop=MouseButton.RIGHT,
mouse_stop=MouseButton.MIDDLE)
Пример
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(7, 5))
ax.plot(np.arange(10), np.random.randn(10), 'o-')
ax.set_title('Щёлкните 3 точки (timeout=15s)')
ax.set_xlim(-1, 10)
ax.set_ylim(-3, 3)
ax.grid(True, alpha=0.3)
print("Пожалуйста, щёлкните 3 точки...")
points = plt.ginput(3, timeout=15, show_clicks=True)
for i, (x, y) in enumerate(points):
print(f"Точка {i+1}: ({x:.2f}, {y:.2f})")
plt.show()
import numpy as np
fig, ax = plt.subplots(figsize=(7, 5))
ax.plot(np.arange(10), np.random.randn(10), 'o-')
ax.set_title('Щёлкните 3 точки (timeout=15s)')
ax.set_xlim(-1, 10)
ax.set_ylim(-3, 3)
ax.grid(True, alpha=0.3)
print("Пожалуйста, щёлкните 3 точки...")
points = plt.ginput(3, timeout=15, show_clicks=True)
for i, (x, y) in enumerate(points):
print(f"Точка {i+1}: ({x:.2f}, {y:.2f})")
plt.show()
waitforbuttonpress() - Ожидание нажатия клавиши
matplotlib.pyplot.waitforbuttonpress(timeout=-1)
Возвращаемое значение: True означает, что была нажата клавиша, False означает, что была нажата кнопка мыши.
Пример
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10, 100)))
ax.set_title('Нажмите любую клавишу или щёлкните мышью')
print("Ожидание нажатия кнопки...")
result = plt.waitforbuttonpress(timeout=10)
if result is None:
print("Тайм-аут!")
elif result:
print("Клавиша была нажата")
else:
print("Мышь была нажата")
plt.show()
import numpy as np
fig, ax = plt.subplots()
ax.plot(np.sin(np.linspace(0, 10, 100)))
ax.set_title('Нажмите любую клавишу или щёлкните мышью')
print("Ожидание нажатия кнопки...")
result = plt.waitforbuttonpress(timeout=10)
if result is None:
print("Тайм-аут!")
elif result:
print("Клавиша была нажата")
else:
print("Мышь была нажата")
plt.show()
findobj() - Найти Artist
matplotlib.pyplot.findobj(o=None, match=None, include_self=False)
Пример
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.lines import Line2D
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6], label='Линия A')
ax.plot([1, 2, 3], [1, 2, 3], label='Линия B')
ax.set_title('Демонстрация поиска объектов')
# Найти все объекты Line2D
lines = ax.findobj(match=Line2D)
print(f"Найдено {len(lines)} объектов-линий")
# Получить конкретные свойства
for line in lines:
print(f" - подпись: {line.get_label()}")
# Используйте get() для получения свойств
ax_title = ax.get_title()
print(f"Заголовок осей: {ax_title}")
plt.show()
import numpy as np
from matplotlib.lines import Line2D
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6], label='Линия A')
ax.plot([1, 2, 3], [1, 2, 3], label='Линия B')
ax.set_title('Демонстрация поиска объектов')
# Найти все объекты Line2D
lines = ax.findobj(match=Line2D)
print(f"Найдено {len(lines)} объектов-линий")
# Получить конкретные свойства
for line in lines:
print(f" - подпись: {line.get_label()}")
# Используйте get() для получения свойств
ax_title = ax.get_title()
print(f"Заголовок осей: {ax_title}")
plt.show()
Found 2 line objects - label: Line A - label: Line B Axes title: Find Objects Demo
get() / setp() - Операции со свойствами
matplotlib.pyplot.get(obj, *args, **kwargs) matplotlib.pyplot.setp(obj, *args, **kwargs) matplotlib.pyplot.getp(obj, *args, **kwargs)
Пример
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(layout='constrained')
line, = ax.plot([0, 1], [0, 1], label='тест')
# get() получает одно свойство
print("цвет линии:", plt.get(line, 'color'))
# getp() получает несколько свойств
props = plt.getp(line)
print(f"линия имеет {len(props)} свойств")
# setp() устанавливает несколько свойств одновременно
plt.setp(line, color='red', linewidth=3, linestyle='--')
ax.set_title('демонстрация setp()')
ax.legend()
plt.show()
print("пример: свойства изменены с помощью setp()")
import numpy as np
fig, ax = plt.subplots(layout='constrained')
line, = ax.plot([0, 1], [0, 1], label='тест')
# get() получает одно свойство
print("цвет линии:", plt.get(line, 'color'))
# getp() получает несколько свойств
props = plt.getp(line)
print(f"линия имеет {len(props)} свойств")
# setp() устанавливает несколько свойств одновременно
plt.setp(line, color='red', linewidth=3, linestyle='--')
ax.set_title('демонстрация setp()')
ax.legend()
plt.show()
print("пример: свойства изменены с помощью setp()")
xkcd() - Стиль комикса, нарисованного от руки
matplotlib.pyplot.xkcd(scale=1, length=100, randomness=2)
Пример
import matplotlib.pyplot as plt
import numpy as np
# Включить стиль xkcd, нарисованный от руки
with plt.xkcd():
fig, ax = plt.subplots(figsize=(8, 5))
x = np.linspace(0, 10, 100)
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.set_title('График в стиле XKCD')
ax.set_xlabel('Время')
ax.set_ylabel('Амплитуда')
ax.legend()
ax.annotate('Это пик!',
xy=(np.pi/2, 1), xytext=(2, 1.3),
arrowprops=dict(arrowstyle='->'))
plt.show()
print("пример: отображён стиль xkcd")
import numpy as np
# Включить стиль xkcd, нарисованный от руки
with plt.xkcd():
fig, ax = plt.subplots(figsize=(8, 5))
x = np.linspace(0, 10, 100)
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.set_title('График в стиле XKCD')
ax.set_xlabel('Время')
ax.set_ylabel('Амплитуда')
ax.legend()
ax.annotate('Это пик!',
xy=(np.pi/2, 1), xytext=(2, 1.3),
arrowprops=dict(arrowstyle='->'))
plt.show()
print("пример: отображён стиль xkcd")
set_loglevel() - Уровень логирования
matplotlib.pyplot.set_loglevel(level)
варианты уровня: 'debug', 'info', 'warning', 'error', 'critical'.
Пример
import matplotlib.pyplot as plt
import numpy as np
# Установите уровень логирования в info (просмотр внутренней информации Matplotlib)
plt.set_loglevel('info')
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Отладка с loglevel')
plt.show()
import numpy as np
# Установите уровень логирования в info (просмотр внутренней информации Matplotlib)
plt.set_loglevel('info')
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Отладка с loglevel')
plt.show()
Другие расширения