MultiIndex多层索引DataFrame按设备分色绘制传感器子图问题
解决方案
核心思路
问题本质是数据维度的排列不符合pandas绘图的分组逻辑,只需要将设备维度从行索引转换到列索引层级,即可自动实现同个采样批次(new_index)下不同设备的柱子颜色区分。
具体实现步骤
1. 数据预处理
首先将数据的多重行索引中的Device维度展开到列层级:
import pandas as pd import matplotlib.pyplot as plt # 加载数据,替换为你实际的读取逻辑 df = pd.read_csv("sensor_data.csv") # 设置多重行索引:第一级为采样批次new_index,第二级为设备名 df = df.set_index(["new_index", "Device:"]) # 将设备维度展开为列的第二层级,列的第一层级为传感器名 df_unstack = df.unstack(level="Device:")
2. 绘图实现
此时直接调用plot方法即可自动满足需求,每个子图对应一个传感器,同个采样点下不同设备的柱子自动分配不同颜色:
axes = df_unstack.plot( kind="bar", subplots=True, figsize=(20, 12), layout=(5, 5), legend=True ) # 可选:自定义每个子图的图例,只显示设备名 for ax in axes.flatten(): if ax.get_legend(): handles, labels = ax.get_legend_handles_labels() # 从自动生成的标签中提取设备名 new_labels = [label.split(", ")[1].rstrip(")") for label in labels] ax.legend(handles, new_labels, title="设备") # 调整布局避免标签重叠 plt.tight_layout() plt.show()
可选:自定义设备配色
如果需要固定每个设备对应的颜色,可在plot参数中传入color列表,长度和设备数量一致即可:
# 四个设备对应四个自定义颜色 custom_colors = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728"] axes = df_unstack.plot( kind="bar", subplots=True, figsize=(20, 12), layout=(5, 5), color=custom_colors, legend=True )
内容的提问来源于stack exchange,提问作者zelmario
相关产品推荐
相关产品推荐

