如何在Matplotlib实时交互绘图中添加复选框切换曲线显示?
Matplotlib图例添加复选框实现曲线显隐控制
Matplotlib没有直接提供带复选框的内置图例,但可以通过matplotlib.widgets.CheckButtons组件手动实现这个功能,完全兼容你当前的动态数据更新逻辑。
实现思路
- 在绘图区域侧边添加复选框组件,对应三条曲线的图例标签
- 为复选框绑定回调函数,点击时切换对应曲线的显示/隐藏状态
- 保留原有的动态数据更新逻辑,曲线显隐由
visible属性自动控制
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import CheckButtons import threading, time # 全局数据初始化 y1 = np.random.rand(100) y2 = np.random.rand(100) y3 = np.random.rand(100) def visualization_thread(): fig = plt.figure() ax = fig.add_subplot(111) # 绘制三条曲线并保存线条对象 l1, *_ = ax.plot(y1, color='r', label="曲线1") l2, *_ = ax.plot(y2, color='g', label="曲线2") l3, *_ = ax.plot(y3, color='b', label="曲线3") # 创建复选框:设置位置、标签和初始可见状态 ax_check = fig.add_axes([0.91, 0.7, 0.1, 0.2]) labels = [line.get_label() for line in [l1, l2, l3]] visibility = [line.get_visible() for line in [l1, l2, l3]] check = CheckButtons(ax_check, labels, visibility) # 复选框回调函数:切换对应曲线的可见性 def toggle_visibility(label): if label == l1.get_label(): l1.set_visible(not l1.get_visible()) elif label == l2.get_label(): l2.set_visible(not l2.get_visible()) elif label == l3.get_label(): l3.set_visible(not l3.get_visible()) fig.canvas.draw_idle() check.on_clicked(toggle_visibility) # 显示图例 ax.legend(loc='upper left') plt.show(block=False) # 动态更新数据循环 while True: l1.set_ydata(y1) l2.set_ydata(y2) l3.set_ydata(y3) fig.canvas.draw_idle() fig.canvas.flush_events() time.sleep(0.020) def data_thread(): global y1, y2, y3 while True: y1 = np.random.rand(100) y2 = np.random.rand(100) y3 = np.random.rand(100) time.sleep(0.020) # 启动线程,设置daemon=True让数据线程随主线程退出 threading.Thread(target=data_thread, daemon=True).start() visualization_thread()
关键说明
CheckButtons通过fig.add_axes指定位置(参数为[左, 下, 宽, 高],基于画布0-1比例坐标)- 回调函数通过匹配标签定位对应曲线,切换
set_visible属性实现显隐 - 动态更新时直接更新所有曲线的ydata,无需额外判断,曲线是否显示由
visible属性自动处理
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

