ggplot2实现日期聚合分组、峰值标注的柱状图开发需求
DataFrame多日期柱状图+峰值标注实现方案
实现步骤
1. 数据预处理
- 计算数值均值,标记峰值行(
value > 2*均值) - 保留原始索引,用于后续定位柱子位置
- 按日期分组,记录每组的索引范围,用于绘制分隔线
import pandas as pd import matplotlib.pyplot as plt # 假设数据集为df,包含date、time、value列 mean_val = df['value'].mean() df['is_peak'] = df['value'] > 2 * mean_val df['orig_idx'] = df.index # 保留原始行索引 # 按日期分组,获取每组的首尾索引 date_ranges = df.groupby('date')['orig_idx'].agg(['min', 'max'])
2. 绘制基础柱状图
- 以原始索引为X轴位置绘制每个柱子,避免日期聚合合并柱子
- 调整X轴刻度为日期,对应到每组的中间位置,保证视觉上的日期分组效果
plt.figure(figsize=(12, 6)) bars = plt.bar(df['orig_idx'], df['value'], width=0.8) # 设置X轴刻度:每个日期对应组的中间位置 tick_pos = date_ranges.apply(lambda x: (x['min'] + x['max']) / 2, axis=1) plt.xticks(tick_pos, date_ranges.index, rotation=45)
3. 添加日期分隔线
- 遍历日期分组,在每组的右侧边界绘制灰色虚线,清晰区分不同日期区域
for _, row in date_ranges.iterrows(): # 分隔线位置为组最后一个柱子的右侧+0.1(适配宽度0.8的柱子) plt.axvline(x=row['max'] + 0.5, color='#888888', linestyle='--')
4. 峰值时间标注
- 筛选峰值行,在对应柱子顶部标注时间,调整偏移量避免遮挡柱子
peak_data = df[df['is_peak']] for _, row in peak_data.iterrows(): # 标注位置:柱子顶部+最大值的2%作为偏移 plt.text(row['orig_idx'], row['value'] + (df['value'].max() * 0.02), row['time'], ha='center', fontsize=8)
5. 图表美化
- 添加标题、坐标轴标签,自动调整布局防止标签截断
plt.title('每日数据柱状图(峰值标注)') plt.xlabel('日期') plt.ylabel('数值') plt.tight_layout() plt.show()
关键要点
- 用原始索引定位柱子,彻底避免日期聚合导致的柱子合并问题
- 通过分组索引范围绘制分隔线,精准划分日期区域
- 仅对满足条件的峰值行添加标注,减少视觉干扰
内容的提问来源于stack exchange,提问作者olikahn
相关产品推荐
相关产品推荐

