Matplotlib - 鼠标移动



在一般的计算机编程和软件设计中,术语鼠标移动指的是将计算机鼠标设备在表面上移动以在屏幕上创建相应的鼠标光标或指针移动的动作。

Matplotlib 中的鼠标移动

Matplotlib 中的鼠标移动事件允许用户捕获光标在绘制图形上的位置。此功能能够创建交互式功能,例如在光标位置显示信息或根据光标的移动实时更新可视化。

在本教程中,我们将探讨如何在 Matplotlib 中使用鼠标移动事件来增强交互式绘图。这是通过连接到motion_notify_event来完成的,您可以捕获光标的位置并实现各种操作,为用户提供一种直观的方式来探索和分析绘制的数据。

示例

让我们从一个简单的示例开始,该示例在鼠标移动到输出图形上时打印数据和像素坐标。

import matplotlib.pyplot as plt
import numpy as np

# Input data for ploting a circle 
angs = np.linspace(0, 2 * np.pi, 10**6)
rs = np.zeros_like(angs) + 1
xs = rs * np.cos(angs)
ys = rs * np.sin(angs)

# Create a figure
fig, ax = plt.subplots(figsize=(7, 4))

# Plot the data
plt.plot(xs, ys)

# Function to handle the event 
def on_move(event):
   if event.inaxes:
      print(f'data coords {event.xdata}, {event.ydata},',
         f'pixel coords {event.x}, {event.y}')

# connect the event with the callable function
binding_id = plt.connect('motion_notify_event', on_move)

# Display the plot
plt.show()

输出

执行上述程序后,您将获得以下输出:

mouse_move_ex1

从上图中,您可以连续读取鼠标移动时的坐标:

data coords 0.22000000000192466, 0.8999999999988899, pixel coords 413, 324
data coords 0.21188940092360364, 0.9071428571417381, pixel coords 411, 325
data coords 0.20377880184528263, 0.9142857142845864, pixel coords 409, 326
data coords 0.19972350230612212, 0.9214285714274346, pixel coords 408, 327
data coords 0.1916129032278011, 0.9214285714274346, pixel coords 406, 327
data coords 0.1916129032278011, 0.9285714285702829, pixel coords 406, 328
data coords 0.18755760368864083, 0.9285714285702829, pixel coords 405, 328
data coords 0.18350230414948032, 0.9357142857131315, pixel coords 404, 329
data coords 0.17944700461031982, 0.9357142857131315, pixel coords 403, 329
data coords 0.1753917050711593, 0.9357142857131315, pixel coords 402, 329
data coords 0.1753917050711593, 0.9428571428559798, pixel coords 402, 330
data coords 0.1713364055319988, 0.9428571428559798, pixel coords 401, 330
data coords 0.1672811059928383, 0.949999999998828, pixel coords 400, 331
data coords 0.1632258064536778, 0.949999999998828, pixel coords 399, 331

观看下面的视频以观察鼠标移动事件功能在此处的工作方式。

mouse_move_ex1 gif

鼠标移动的实时绘图

可以通过在 matplotlib 中使用 motion_notify_event 来实现鼠标移动的近乎实时绘图。此事件允许您捕获鼠标光标的动态移动,从而能够创建交互式和响应式可视化。

示例

以下示例演示了如何使用 Matplotlib 实时绘制鼠标路径。

import matplotlib.pyplot as plt

# Create the plot
fig, ax = plt.subplots(figsize=(7, 4))

# Set the limits of the plot
ax.set_xlim(0, 1920-1)
ax.set_ylim(0, 1080-1)

# Initialize lists to store mouse coordinates
x,y = [0], [0]

# create empty plot
points, = ax.plot([], [], '-', color='green')

# cache the background
background = fig.canvas.copy_from_bbox(ax.bbox)

def on_move(event):
   # Append the current mouse coordinates
   x.append(event.xdata)
   y.append(event.ydata)

   # Update the plot data  
   points.set_data(x,y)

   # Restore the background
   fig.canvas.restore_region(background)

   # Redraw the points
   ax.draw_artist(points)

   # Fill in the axes rectangle
   fig.canvas.blit(ax.bbox)

# Connect the on_move function to the motion_notify_event
fig.canvas.mpl_connect("motion_notify_event", on_move)

# Display the plot
plt.show()

输出

执行上述程序后,您将获得以下输出:

mouse_move_ex2

观看下面的视频以观察鼠标移动事件功能在此处的工作方式。

mouse_move_ex2 gif

使用 TriFinder 高亮三角形

使用matplotlib.tri模块中的TriFinder类来识别三角剖分内的三角形。通过将其与motion_notify_event结合使用,您可以动态突出显示鼠标移动到三角剖分图上的三角形。

示例

此示例演示了在 Matplotlib 中使用 TriFinder 对象。当鼠标在三角剖分上移动时,光标下的三角形会突出显示,并且三角形的索引会显示在绘图标题中。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Polygon
from matplotlib.tri import Triangulation

def update_highlighted_triangle(triangle_index):
   if triangle_index == -1:
      points = [0, 0, 0]
   else:
      points = triangulation.triangles[triangle_index]
   xs = triangulation.x[points]
   ys = triangulation.y[points]
   highlighted_polygon.set_xy(np.column_stack([xs, ys]))

def on_mouse_move(event):
   if event.inaxes is None:
      triangle_index = -1
   else:
      triangle_index = tri_finder(event.xdata, event.ydata)
   update_highlighted_triangle(triangle_index)
   ax.set_title(f'In triangle {triangle_index}')
   event.canvas.draw()

# Create a Triangulation.
num_angles = 16
num_radii = 5
min_radius = 0.25
radii = np.linspace(min_radius, 0.95, num_radii)
angles = np.linspace(0, 2 * np.pi, num_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], num_radii, axis=1)
angles[:, 1::2] += np.pi / num_angles
x_values = (radii*np.cos(angles)).flatten()
y_values = (radii*np.sin(angles)).flatten()
triangulation = Triangulation(x_values, y_values)
triangulation.set_mask(np.hypot(x_values[triangulation.triangles].mean(axis=1),
   y_values[triangulation.triangles].mean(axis=1))
   < min_radius)

# Use the triangulation's default TriFinder object.
tri_finder = triangulation.get_trifinder()

# Setup plot and callbacks.
fig, ax = plt.subplots(subplot_kw={'aspect': 'equal'}, figsize=(7, 4))
ax.triplot(triangulation, 'bo-')
highlighted_polygon = Polygon([[0, 0], [0, 0]], facecolor='y')  # dummy data for (xs, ys)
update_highlighted_triangle(-1)
ax.add_patch(highlighted_polygon)
fig.canvas.mpl_connect('motion_notify_event', on_mouse_move)
plt.show()

输出

执行上述程序后,您将获得以下输出:

mouse_move_ex3

观看下面的视频以观察鼠标移动事件功能在此处的工作方式。

mouse_move_ex3 Gif
广告