Python编写程序,绘制一个周期的正弦曲线,并实现下面的功能:1)鼠标进行图形区域之后,设置图形背景色为黄色,鼠标离开图形区域时将其恢复为白色;2)当鼠标移动至正弦曲线附近(距离小于2个像素)时在鼠标上方出现文本标注当前值,鼠标远离曲线时文本标注自动消失。
时间: 2024-02-26 22:57:56 浏览: 173
好的,这是一个有趣的问题!首先,我们需要先导入必要的库:
```python
import numpy as np
import matplotlib.pyplot as plt
```
然后,我们可以用以下代码生成正弦曲线:
```python
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()
```
这段代码将生成一个包含100个点的正弦曲线,并将其绘制出来。
接下来,我们需要实现第一个功能:当鼠标进入图形区域时,将背景色设置为黄色。我们可以使用以下代码实现:
```python
def on_enter(event):
event.canvas.figure.patch.set_facecolor('yellow')
event.canvas.draw()
def on_leave(event):
event.canvas.figure.patch.set_facecolor('white')
event.canvas.draw()
fig.canvas.mpl_connect('figure_enter_event', on_enter)
fig.canvas.mpl_connect('figure_leave_event', on_leave)
```
这段代码创建了两个函数,`on_enter` 和 `on_leave`,它们分别在鼠标进入和离开图形区域时被调用。在`on_enter`函数中,我们将图形背景色设置为黄色,并在`on_leave`函数中将其恢复为白色。
最后,我们需要实现第二个功能:当鼠标靠近正弦曲线时,在鼠标上方出现文本标注当前值。我们可以使用以下代码实现:
```python
def on_motion(event):
if event.inaxes is not None:
x, y = event.xdata, event.ydata
index = np.abs(x - np.array(x)).argmin()
value = y[index]
if np.abs(y[index] - event.ydata) <= 0.02:
ax.text(event.xdata, event.ydata, f'{value:.2f}', fontsize=10, ha='center', va='bottom')
fig.canvas.draw_idle()
else:
ax.texts.clear()
fig.canvas.draw_idle()
fig.canvas.mpl_connect('motion_notify_event', on_motion)
```
这段代码创建了一个名为`on_motion`的函数,它将在鼠标移动时被调用。在函数中,我们首先检查鼠标是否在图形区域内,如果是,则计算鼠标所在点的纵坐标值。然后,我们检查鼠标是否在曲线附近,如果是,则在鼠标上方绘制文本标注当前值。如果鼠标远离曲线,则文本标注将被自动清除。
最后,我们将所有代码整合在一起,并运行程序:
```python
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y)
def on_enter(event):
event.canvas.figure.patch.set_facecolor('yellow')
event.canvas.draw()
def on_leave(event):
event.canvas.figure.patch.set_facecolor('white')
event.canvas.draw()
def on_motion(event):
if event.inaxes is not None:
x, y = event.xdata, event.ydata
index = np.abs(x - np.array(x)).argmin()
value = y[index]
if np.abs(y[index] - event.ydata) <= 0.02:
ax.text(event.xdata, event.ydata, f'{value:.2f}', fontsize=10, ha='center', va='bottom')
fig.canvas.draw_idle()
else:
ax.texts.clear()
fig.canvas.draw_idle()
fig.canvas.mpl_connect('figure_enter_event', on_enter)
fig.canvas.mpl_connect('figure_leave_event', on_leave)
fig.canvas.mpl_connect('motion_notify_event', on_motion)
plt.show()
```
现在,当你运行程序时,你将看到一个包含正弦曲线的窗口。当你将鼠标移动到窗口内时,背景色将变为黄色,并在鼠标附近出现文本标注当前值。当你将鼠标移开窗口时,背景色将恢复为白色,文本标注也将自动消失。
阅读全文