如何在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
相关产品推荐
相关产品推荐

