You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:10:19