matplotlib 曲线上点击鼠标显示自定义标注同时保留两个
时间: 2023-10-02 09:04:20 浏览: 175
python中matplotlib实现随鼠标滑动自动标注代码
5星 · 资源好评率100%
你可以使用 matplotlib 的 event handling 来实现曲线上点击鼠标显示自定义标注的功能。具体步骤如下:
1. 导入必要的库和数据:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
```
2. 创建一个 figure 和两个子图,并画出两条曲线:
```python
# 创建 figure 和两个子图
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
# 在第一个子图上画出第一条曲线
ax1.plot(x, y1)
ax1.set_ylabel('sin(x)')
# 在第二个子图上画出第二条曲线
ax2.plot(x, y2)
ax2.set_ylabel('cos(x)')
ax2.set_xlabel('x')
```
3. 定义一个函数 `on_click`,用于处理鼠标点击事件。在该函数中,首先获取当前鼠标点击的坐标,并将其转换为数据坐标。然后根据数据坐标找到最近的点,并在该点上添加一个文本标注:
```python
def on_click(event):
if event.inaxes is not None:
ax = event.inaxes
x, y = event.xdata, event.ydata
index = np.argmin(np.abs(x - xdata))
x_near, y_near = xdata[index], ydata[index]
text = ax.text(x_near, y_near, f'({x_near:.2f}, {y_near:.2f})',
fontsize=10, ha='center', va='bottom', color='red')
fig.canvas.draw()
```
在该函数中,`event.inaxes` 表示当前鼠标点击的坐标所在的子图对象,如果为 `None` 则表示鼠标点击位置不在任何一个子图对象上。`event.xdata` 和 `event.ydata` 分别表示鼠标点击位置的横坐标和纵坐标,需要将其转换为数据坐标。在这里我们没有保存每个子图对应的数据集,而是使用了前面定义的 `x` 和 `y1, y2`,因此需要在函数中先将这些数据集取出来:
```python
xdata, ydata = ax.lines[0].get_data()
```
然后使用 `np.argmin` 找到最近的点的下标,再根据下标取出该点的坐标,最后在该点上添加一个文本标注。
4. 将 `on_click` 函数绑定到 figure 上的 `button_press_event` 事件:
```python
cid = fig.canvas.mpl_connect('button_press_event', on_click)
```
5. 运行程序并点击曲线上的点,可以看到在最近的点上添加了一个文本标注。此时如果再点击其他点,则新的文本标注会覆盖之前的文本标注。如果要保留之前的文本标注,可以将每个文本标注的对象保存在一个列表中,再在 `on_click` 函数中先清除所有的文本标注,再重新添加新的文本标注:
```python
# 在程序开始时定义一个空的列表
texts = []
# 修改 on_click 函数
def on_click(event):
if event.inaxes is not None:
ax = event.inaxes
x, y = event.xdata, event.ydata
index = np.argmin(np.abs(x - xdata))
x_near, y_near = xdata[index], ydata[index]
# 先清除所有的文本标注
for text in texts:
text.remove()
texts.clear()
# 添加新的文本标注
text = ax.text(x_near, y_near, f'({x_near:.2f}, {y_near:.2f})',
fontsize=10, ha='center', va='bottom', color='red')
texts.append(text)
fig.canvas.draw()
```
这样就可以在曲线上保留多个文本标注了。
阅读全文