python - Matplotlib:滑块轴外的鼠标继续改变绘图
问题描述
我有一个简单的脚本,可以在 x- 和 y- 中绘制数据,并且有两个滚动条。一个滚动条可让您滚动浏览 x 中的数据。第二个滚动条允许您更改在给定时间看到的 x 值的范围(下面的 SSCE)。它的效果几乎很好:当我滑动位置滑块时,情节会按预期滑动。滑动“宽度”滑块会更改您看到的数据范围。
一个错误是,在我更改宽度后,当我将鼠标滚动到位置滚动条的右边缘时,它实际上会不断更改绘图。动图:
我有点不知所措我不确定为什么一旦鼠标离开滚动条轴它就会注册任何事件。
相关问题
Matplotlib 更新滑块小部件范围
重现问题的代码
%matplotlib qt
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
x = np.arange(0, 20, 0.01)
y = np.sin(2*np.pi*x)+np.random.normal(0, 1, x.shape)
width_init = 3
delta = x[1]-x[0]
position = x[0]
final_value = x[-1]-width_init
fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)
plt.plot(x, y, linewidth = 0.5, color = 'grey')
plt.xlim(position, position + width_init)
# position slider
slider_pos = plt.axes([0.2, 0.1, 0.65, 0.03])
spos = Slider(slider_pos, 'Pos', valmin = x[0],
valmax = final_value, valinit = position)
# width slider
slider_width = plt.axes([0.2, 0.05, 0.5, 0.03])
swidth = Slider(slider_width, 'Width', valmin = delta*4,
valmax = x[-1]-delta, valinit = width_init)
def update(val):
position = spos.val
width = swidth.val
slider_pos.valmin = x[0]
slider_pos.valmax = x[-1]-width-delta
if width < width_init:
spos.valmax = x[-1]-width
if position+width > x[-1]:
spos.set_val(slider_pos.valmax)
slider_pos.axes.set_xlim(slider_pos.valmin,slider_pos.valmax)
ax.set_xlim(position, position+width if position+width <= x[-1] else x[-1])
fig.canvas.draw_idle()
spos.on_changed(update);
swidth.on_changed(update);
解决方案
看起来您在代码中混淆了滑块spos
和滑块轴slider_pos
。您正在设置然后读取轴对象的valmax
andvalmin
属性。这不会引发错误,因为您只是在创建一个新属性。但是您没有正确更新实际的滑块对象。
尝试用update
这个替换函数:
def update(val):
position = spos.val
width = swidth.val
# Update the valmin and valmax of the spos Slider object
spos.valmin = x[0]
spos.valmax = x[-1]-width-delta
if width < width_init:
spos.valmax = x[-1]-width
if position+width > x[-1]:
spos.set_val(spos.valmax)
# Update the slider axis to reflect the new min/max
slider_pos.axes.set_xlim(spos.valmin,spos.valmax)
ax.set_xlim(position, position+width)
fig.canvas.draw_idle()
推荐阅读
- android - 在 Android Studio 的 JUnit 配置中添加了单独的插桩测试
- swift - CLLocationManager:没有调用 didChangeAuthorization 和 didRangeBeacons
- intellij-idea - 没有在 IntelliJ Dart 模板中添加新的颤振 Web 项目的选项!!!还尝试了 Vs 代码,正在询问哪个 Dart 模板
- python - 交叉检查和验证 django 中的两个输入字段
- amazon-web-services - 更改 EC2 实例 AWS 的 CIDR 块
- javascript - 购物车的 React.js 弹出模式
- c# - 在 ASP.NET Core for SPA 中确定基于路由或域的静态文件
- java - 如何摆脱出现在我的 Android 应用顶部的额外间距?
- javascript - 计算小费数组,但数组为空
- apache-spark - SubqueryAlias 在 Spark 2.4 逻辑计划中为空。是虫子吗?