You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:32:10