如何使用groupby遍历列,为每个机器生成speed、Temp对应柱状图
实现方案
核心思路
通过groupby('machine')按机器拆分数据集,每台机器单独遍历需要绘图的指标列生成对应柱状图,同时优化内存占用避免大量绘图导致的程序崩溃。
完整代码
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # ---------------------- 以下是测试数据生成,自有数据场景可跳过这部分 ---------------------- bins = [f'({n*200}, {(n+1)*200}]' for _ in range(50) for n in range(109)] machines = [f'machine_{n}' for n in range(50) for _ in range(109)] np.random.seed(365) speed = np.random.randint(0, 40, size=len(machines)) temp = np.random.choice([0, 30, 70], size=len(machines)) df = pd.DataFrame({'machine': machines, 'bin': bins, 'speed': speed, 'Temp': temp}) # ---------------------- 测试数据生成结束 ---------------------- # 定义需要绘图的指标列 plot_cols = ['speed', 'Temp'] sns.set(style="ticks") # 按机器分组迭代 for machine_name, group_df in df.groupby('machine'): # 遍历每个指标生成对应图表 for col in plot_cols: fig, ax = plt.subplots(figsize=(22, 14)) sns.barplot(x='bin', y=col, data=group_df, ax=ax) # 配置图表样式 ax.set_title(f'{machine_name} {col} 分布', fontsize=18) plt.xlabel('bin区间', fontsize=14) plt.ylabel(col, fontsize=14) # x轴标签旋转90度避免重叠 plt.xticks(rotation=90, fontsize=10) sns.despine(offset=10, trim=True) # 可选:保存图片到本地,替换为你自己的保存路径 plt.savefig(f'./{machine_name}_{col}.png', dpi=120, bbox_inches='tight') # 关闭画布释放内存,批量绘图必须加 plt.close()
注意事项
- 如果你用的是第一个样例数据,存在
machine_a写成machine a的拼写不一致问题,先清洗数据再分组:df['machine'] = df['machine'].str.replace(' ', '_') - 可以根据实际需求调整图表尺寸、字体大小、dpi等参数,不需要保存图片的话可以去掉
plt.savefig行,替换为plt.show()即可。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

