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

Python绘制多列实时DataFrame动态图及同前缀列统一配色方法

Pandas实时数据动态绘图实现方案

原代码失效原因

  • 未开启matplotlib交互模式,默认plt.show()会阻塞进程,循环无法持续执行
  • 每次循环调用DataFrame的plot()方法都会新建绘图对象,没有复用画布实现增量刷新
  • 未自定义列配色规则,默认使用调色板循环给每条折线分配独立颜色,无法实现CE/PE分组同色效果

修复实现

核心配置逻辑

  • 初始化阶段开启matplotlib交互模式,提前创建固定画布和坐标轴
  • 提前构建列名-颜色映射表:所有CE_前缀列统一使用同一种颜色,所有PE_前缀列统一使用另一种颜色
  • 循环内仅清空坐标轴内容重绘最新数据,重绘后通过plt.pause()完成渲染并等待30秒,替代阻塞式的sleep()
  • 可手动添加分类图例,避免同组同色的多条折线重复出现在图例中占用空间

完整可运行代码

import pandas as pd
import matplotlib.pyplot as plt
from time import sleep

# 提前配置颜色,可按需修改色值
CE_COLOR = "#1f77b4"  # CE类折线统一蓝色
PE_COLOR = "#ff7f0e"  # PE类折线统一橙色

def draw_method():
    # 开启交互模式
    plt.ion()
    # 提前初始化画布和轴
    fig, ax = plt.subplots(figsize=(10,5))
    
    while True:
        # 清空当前轴内容
        ax.clear()
        # 获取最新数据
        temp_var = live_data()
        final_dataframe = pd.DataFrame(temp_var)
        plot_df = final_dataframe.set_index('TIME')
        
        # 构建每列对应的颜色映射
        color_map = []
        for col in plot_df.columns:
            if col.startswith('CE_'):
                color_map.append(CE_COLOR)
            elif col.startswith('PE_'):
                color_map.append(PE_COLOR)
        
        # 绘制折线,传入自定义配色
        plot_df.plot(ax=ax, color=color_map, grid=True)
        
        # 可选:优化图例,仅保留两个分类标识,隐藏同组重复图例
        handles, labels = ax.get_legend_handles_labels()
        ce_handle = handles[labels.index(next(col for col in labels if col.startswith('CE_')))]
        pe_handle = handles[labels.index(next(col for col in labels if col.startswith('PE_')))]
        ax.legend([ce_handle, pe_handle], ['CE类指标', 'PE类指标'])
        
        # 渲染图表
        plt.gcf()
        plt.pause(0.1) # 留足时间完成界面渲染
        sleep(30) # 等待30秒拉取新数据

注:如果需要调整配色,直接修改顶部CE_COLOR和PE_COLOR的色值即可,支持十六进制色值、RGB元组、matplotlib内置颜色名等格式。


内容的提问来源于stack exchange,提问作者Rushi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:27:17