Введение
Этот практикум旨在向您介绍 Matplotlib 中的拾取概念。能够拾取艺术家对象是一个强大的工具,可用于构建响应用户操作的交互式可视化。我们将介绍简单拾取、使用自定义命中测试函数进行拾取、在散点图上进行拾取以及拾取图像。
Советы по работе с ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в Jupyter Notebook.
Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений в Jupyter Notebook.
Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Простая подборка, линии, прямоугольники и текст
Начнем с включения простой подборки, установив свойство "picker" для художника. Это позволит художнику сгенерировать событие подбора, если событие мыши происходит над художником. Создадим простую диаграмму, содержащую линию, прямоугольник и текст, и применим подборку для каждого из этих художников.
fig, (ax1, ax2) = plt.subplots(2, 1)
ax1.set_title('click on points, rectangles or text', picker=True)
ax1.set_ylabel('ylabel', picker=True, bbox=dict(facecolor='red'))
line, = ax1.plot(rand(100), 'o', picker=True, pickradius=5)
## Выберите прямоугольник.
ax2.bar(range(10), rand(10), picker=True)
for label in ax2.get_xticklabels(): ## Сделайте метки делений по оси x доступными для подбора.
label.set_picker(True)
Создание пользовательской функции проверки попадания
В этом шаге мы определим пользовательский подборщик, установив picker равным вызываемой функции. Функция будет определять, попадает ли мышью на художника. Если событие мыши происходит над художником, мы вернем hit=True, а props - это словарь свойств, которые вы хотите добавить к атрибутам .PickEvent.
def line_picker(line, mouseevent):
"""
Найти точки в определенном расстоянии от щелчка мыши в
координатах данных и прикрепить некоторые дополнительные атрибуты, pickx и picky
которые являются точками данных, которые были выбраны.
"""
if mouseevent.xdata is None:
return False, dict()
xdata = line.get_xdata()
ydata = line.get_ydata()
maxd = 0.05
d = np.sqrt(
(xdata - mouseevent.xdata)**2 + (ydata - mouseevent.ydata)**2)
ind, = np.nonzero(d <= maxd)
if len(ind):
pickx = xdata[ind]
picky = ydata[ind]
props = dict(ind=ind, pickx=pickx, picky=picky)
return True, props
else:
return False, dict()
def onpick2(event):
print('onpick2 line:', event.pickx, event.picky)
fig, ax = plt.subplots()
ax.set_title('custom picker for line data')
line, = ax.plot(rand(100), rand(100), 'o', picker=line_picker)
fig.canvas.mpl_connect('pick_event', onpick2)
Подборка на точечной диаграмме
Точечная диаграмма основана на ~matplotlib.collections.PathCollection. Мы создадим точечную диаграмму и применим подборку.
x, y, c, s = rand(4, 100)
def onpick3(event):
ind = event.ind
print('onpick3 scatter:', ind, x[ind], y[ind])
fig, ax = plt.subplots()
ax.scatter(x, y, 100*s, c, picker=True)
fig.canvas.mpl_connect('pick_event', onpick3)
Подборка изображений
Изображения, нарисованные с использованием .Axes.imshow, являются объектами ~matplotlib.image.AxesImage. Мы создадим фигуру с несколькими изображениями и применим подборку.
fig, ax = plt.subplots()
ax.imshow(rand(10, 5), extent=(1, 2, 1, 2), picker=True)
ax.imshow(rand(5, 10), extent=(3, 4, 1, 2), picker=True)
ax.imshow(rand(20, 25), extent=(1, 2, 3, 4), picker=True)
ax.imshow(rand(30, 12), extent=(3, 4, 3, 4), picker=True)
ax.set(xlim=(0, 5), ylim=(0, 5))
def onpick4(event):
artist = event.artist
if isinstance(artist, AxesImage):
im = artist
A = im.get_array()
print('onpick4 image', A.shape)
fig.canvas.mpl_connect('pick_event', onpick4)
Резюме
В этом практическом занятии мы узнали, как включить подборку для различных художников в Matplotlib, включая линии, прямоугольники, текст, точечные диаграммы и изображения. Мы также узнали, как определить пользовательские функции проверки попадания, чтобы обеспечить более сложную поведение подбора. Эта мощная функция позволяет создавать интерактивные визуализации, которые реагируют на действия пользователя.