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
相关产品推荐
相关产品推荐

