Python:如何在同一时间戳下绘制多传感器多指标对比图
传感器数据并列柱状图绘制修正方案
问题背景
现有传感器数据CSV包含时间戳、传感器ID(2、3)、指标类型(Con、Temp、hum)及对应数值,需求为在同一时间戳下,为两个传感器的3类指标共6个数据绘制不同颜色的并列柱状图,但当前代码无法实现该效果。
数据示例
29-03-2023 18:08,2,Con,0 29-03-2023 18:08,2,Temp,27.2 29-03-2023 18:08,2,hum,44.4 29-03-2023 18:08,2,Con,0 29-03-2023 18:08,2,Temp,27.2 29-03-2023 18:08,2,hum,44.3 29-03-2023 18:08,2,Con,0 29-03-2023 18:08,2,Temp,27.2 29-03-2023 18:08,2,hum,44.4 29-03-2023 18:09,2,Con,0 29-03-2023 18:09,2,Temp,27.2 29-03-2023 18:09,2,hum,44.4 29-03-2023 18:09,3,Con,0 29-03-2023 18:09,3,Temp,27.2 29-03-2023 18:09,3,hum,44.4
当前代码问题分析
- 分组逻辑冗余,多次重复分组和去重导致数据处理混乱
pivot用法错误,未将传感器ID与指标类型组合作为列标识,无法区分同一时间戳下不同传感器的相同指标- 错误启用
stacked=True,不符合并列柱状图的需求 - X轴标签设置错误,会导致时间戳重复显示
修正后代码
import pandas as pd import matplotlib.pyplot as plt # 读取数据并设置列名 df = pd.read_csv('sensor_data_1.csv', header=None, names=['timestamp', 'sensor_id', 'metric', 'value']) # 去重:保留每个时间戳-传感器ID-指标的唯一数据 dfe = df.drop_duplicates(subset=['timestamp', 'sensor_id', 'metric']) # 合并传感器ID和指标类型,生成唯一的系列名称 dfe['series_name'] = dfe.apply(lambda row: f"Sensor {row['sensor_id']}-{row['metric']}", axis=1) # 转换数据格式:时间戳为索引,系列名称为列,数值为值 df_plot = dfe.pivot(index='timestamp', columns='series_name', values='value') # 绘制并列柱状图 ax = df_plot.plot(kind='bar', stacked=False, figsize=(10, 6)) # 设置X轴标签旋转角度,避免重叠 ax.set_xticklabels(df_plot.index, rotation=45, ha='right') # 添加标题和轴标签 ax.set_title('Sensor Metrics by Timestamp') ax.set_xlabel('Timestamp') ax.set_ylabel('Metric Value') # 显示图例 plt.legend(title='Sensor-Metric', bbox_to_anchor=(1.05, 1), loc='upper left') # 调整布局防止标签被截断 plt.tight_layout() plt.show()
核心修正点
- 规范列命名:为DataFrame设置明确列名,避免用索引操作带来的混乱
- 精准去重:基于时间戳、传感器ID、指标类型三个维度去重,保留有效数据
- 唯一系列标识:将传感器ID和指标类型合并为新列,确保每个数据系列唯一可区分
- 正确数据透视:使用
pivot将数据转换为"时间戳为行,系列为列"的格式,适配柱状图绘制 - 图表样式优化:关闭堆叠模式,调整X轴标签角度、图例位置,优化图表可读性
内容的提问来源于stack exchange,提问作者Sukumar.M
相关产品推荐
相关产品推荐

