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

如何在ggplot图表中添加weekday2区间标注或X轴标签

R ggplot2 周小时区间标注实现方案

方案1:两条红色虚线之间添加周标识(和预期效果一致)

实现逻辑:先统计每个weekday2对应24小时区间的中点位置,在曲线上方对应位置添加文本标注即可,完整可运行代码如下:

library(tidyverse)

# 原始数据
q3<-structure(list(week_hour = 1:168, week_hour_dummy = c(0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 168), over_supply = c(15.6, 17.2, 13, 11.6, 9.8, 13.2, 16.8, 
15.8, 13.8, 12.8, 26.4, 42.2, 40.8, 38, 41.2, 48.2, 47.2, 42.4, 
18.4, 35.4, 47.2, 42, 26.6, 24.8, 19.4, 21.2, 16.2, 16.6, 16.8, 
16.2, 21.8, 23.4, 13, 13, 36.2, 42.2, 41, 38.4, 39.6, 47, 43.2, 
42.4, 21.8, 23.8, 40.2, 34.6, 23.8, 15, 15.8, 23, 22.4, 15.8, 
15.6, 18.5, 21.4, 24.4, 18.8, 15.4, 46.8, 53.4, 43.6, 42.4, 48.6, 
48, 57, 19.2, 14.8, 23.2, 39.2, 43.8, 28, 13, 15.4, 28.6, 16.6, 
15.6, 18.4, 20.2, 25, 22.8, 14.2, 10.8, 31.4, 37.6, 37.2, 32, 
37.4, 40.4, 40.4, 23, 8.6, 11, 23.2, 33, 26.2, 8.2, 7, 22.4, 
20, 12, 15.4, 18.8, 22.6, 20.4, 10.2, 4.4, 21.2, 28, 30.6, 29.4, 
26, 22.8, 31.4, 20.4, 4.8, 18.6, 27.2, 35, 48.8, 32.6, 20.6, 
19.8, 12.6, 7.4, 11, 23.8, 25.2, 21.4, 20.4, 20.2, 17.6, 18, 
20.2, 30.4, 22.6, 25.8, 31.8, 35.6, 43, 37, 36.8, 44, 47.4, 33.2, 
17, 16.8, 22.6, 15.8, 15, 23, 23.8, 21.8, 17.4, 17.4, 21.2, 18.2, 
11, 14.6, 26.6, 31, 27.4, 29.4, 27.4, 29.6, 33, 34.8, 16, 17.4
), weekday2 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L), .Label = c("E", 
"T", "K", "N", "R", "L", "P"), class = "factor")), row.names = c(NA, 
-168L), class = c("tbl_df", "tbl", "data.frame"))

# 生成标注用数据:取每个weekday的中间位置作为文本x坐标
label_df <- q3 %>%
  group_by(weekday2) %>%
  summarise(
    x_mid = median(week_hour),
    y_pos = max(q3$over_supply) + 2 # 放在曲线最高点上方,避免遮挡
  )

# 绘图代码
ggplot(data=q3) +
  geom_line(aes(x=week_hour, y=over_supply, group=1),lwd=1,col="blue")+
  geom_vline(data = subset(q3, !(week_hour_dummy == 0)),
             aes(xintercept = week_hour),
             size = 1, colour = "red", linetype="dashed") +
  # 添加区间标注
  geom_text(data = label_df, aes(x = x_mid, y = y_pos, label = weekday2), size = 5, col = "red") +
  # 调整Y轴范围避免标注被截断
  ylim(c(min(q3$over_supply)-2, max(q3$over_supply)+5)) +
  labs(x = "周小时", y = "供过于求量") +
  theme_bw()

方案2:将weekday2添加到X轴展示

如果不需要顶部标注,直接把weekday标识放在X轴对应区间中点位置,替换上述代码的绘图部分即可:

# 先获取每个weekday对应的中点和标签
x_breaks <- label_df$x_mid
x_labels <- label_df$weekday2

ggplot(data=q3) +
  geom_line(aes(x=week_hour, y=over_supply, group=1),lwd=1,col="blue")+
  geom_vline(data = subset(q3, !(week_hour_dummy == 0)),
             aes(xintercept = week_hour),
             size = 1, colour = "red", linetype="dashed") +
  # 修改X轴,添加weekday标识
  scale_x_continuous(
    breaks = x_breaks,
    labels = x_labels,
    # 可选:保留原始小时刻度作为次要刻度
    minor_breaks = seq(0, 168, 12)
  ) +
  labs(x = "星期", y = "供过于求量") +
  theme_bw()

内容的提问来源于stack exchange,提问作者Priit Mets

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 08:45:01