如何基于多传感器列数据创建分传感器的行/柱/饼统计图表?
解决多列传感器数据的分组统计可视化问题
我懂你的困扰——很多可视化示例都是盯着单一列做分析,但你要的是把多列传感器数据(比如sensor1、sensor2、sensor3)按传感器维度拆分,生成对应统计指标(计数、平均值)的行图、柱状图或饼图,每个行/柱/扇区对应一个传感器。其实核心步骤是把宽格式数据转成长格式,之后不管用代码还是可视化工具都能轻松实现,下面分两种场景给你具体方案:
一、用Python(Pandas + Matplotlib/Seaborn)实现
1. 先把宽格式数据转成长格式
你的原始数据是“每列对应一个传感器”的宽格式,我们需要把它转成“每行对应一个传感器的一条记录”的长格式——这是解决问题的关键。用Pandas的melt函数就能快速完成:
import pandas as pd import matplotlib.pyplot as plt # 模拟你的传感器数据(替换成你真实的数据即可) raw_data = pd.DataFrame({ 'time': pd.date_range(start='2024-01-01', periods=10, freq='H'), 'sensor1': [12, 15, 13, 14, 16, 15, 17, 14, 13, 15], 'sensor2': [22, 25, 23, 24, 26, 25, 27, 24, 23, 25], 'sensor3': [32, 35, 33, 34, 36, 35, 37, 34, 33, 35] }) # 宽转长:把sensor1/sensor2/sensor3转成一个分组列'sensor',数值统一放到'reading'列 melted_data = raw_data.melt( id_vars=['time'], # 保留不需要转换的列(比如时间) var_name='sensor', # 新的分组列名称 value_name='reading' # 统一的数值列名称 )
2. 统计各传感器的指标
转成长格式后,就能按sensor分组统计平均值、计数了:
sensor_stats = melted_data.groupby('sensor').agg( average_reading=('reading', 'mean'), reading_count=('reading', 'count') ).reset_index()
3. 生成各类图表
柱状图(展示平均值/计数)
# 平均值柱状图 plt.figure(figsize=(8, 5)) plt.bar(sensor_stats['sensor'], sensor_stats['average_reading'], color='skyblue') plt.title('Average Reading by Sensor') plt.xlabel('Sensor') plt.ylabel('Average Reading') plt.tight_layout() plt.show() # 计数柱状图(如果有缺失值,计数会有差异) plt.figure(figsize=(8, 5)) plt.bar(sensor_stats['sensor'], sensor_stats['reading_count'], color='salmon') plt.title('Number of Valid Readings by Sensor') plt.xlabel('Sensor') plt.ylabel('Count') plt.tight_layout() plt.show()
行图(展示传感器统计值的对比趋势)
plt.figure(figsize=(8, 5)) plt.plot(sensor_stats['sensor'], sensor_stats['average_reading'], marker='o', linestyle='-', color='darkgreen') plt.title('Average Reading Trend Across Sensors') plt.xlabel('Sensor') plt.ylabel('Average Reading') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show()
饼图(展示读数占比)
plt.figure(figsize=(8, 8)) plt.pie( sensor_stats['reading_count'], labels=sensor_stats['sensor'], autopct='%1.1f%%', colors=['#ff9999','#66b3ff','#99ff99'] ) plt.title('Proportion of Valid Readings by Sensor') plt.show()
二、用Tableau等可视化工具实现
如果不想写代码,用Tableau也能快速实现:
- 导入你的数据后,找到sensor1、sensor2、sensor3这些列,右键选择**"转换为度量"**
- 把**"度量名称"拖到列/行(比如做柱状图就拖到列),把"平均值(读数)"或"计数(读数)"**拖到标记卡的“行”位置
- 此时图表会自动按每个传感器生成对应的柱/行/扇区,你可以直接调整样式、添加标题等
关键总结
不管用哪种方式,核心都是把宽格式数据转成长格式——因为大多数可视化工具/库都是基于“分组字段+数值字段”的结构来生成多元素的图表,你的原始数据把传感器信息存在了列名里,转成单独的分组列后,统计和可视化就都顺理成章了。
内容的提问来源于stack exchange,提问作者user1997332
相关产品推荐
相关产品推荐

