如何在ggplot分面图中为每日添加下载/上传均值文本?
解决分面添加当日网速均值文本的问题
错误原因
你遇到的time_trans错误,是因为用于geom_text的数据集里,对应x轴的时间列不是POSIXct类型,或是在指定文本位置时用了非时间格式的值,和主图的时间轴类型不匹配导致的。
管道内实现的解决方案
不需要单独创建均值数据集,直接在数据处理管道里分组计算均值并生成文本,同时确保文本的x轴位置为合法的POSIXct类型,就能避免报错:
假设你的原始数据结构如下:
# 样例数据集结构 speedtest <- tibble( datetime = as.POSIXct(c("2024-05-01 08:00:00", "2024-05-01 12:00:00", "2024-05-02 09:00:00", "2024-05-02 16:00:00")), download = c(50.2, 52.8, 48.5, 51.3), upload = c(10.1, 11.2, 9.8, 10.5) )
修正后的完整管道代码:
library(tidyverse) speedtest %>% # 提取日期作为分面依据,同时分组计算当日均值 mutate(date = as.Date(datetime)) %>% group_by(date) %>% mutate( mean_download = mean(download, na.rm = TRUE), mean_upload = mean(upload, na.rm = TRUE), # 拼接指定格式的均值文本 download_text = str_glue("Mean Download: {round(mean_download, 1)}"), upload_text = str_glue("Mean Upload: {round(mean_upload, 1)}"), # 设置文本x轴位置:取当日最后一个时间点,确保为POSIXct类型 text_x = max(datetime), # 设置文本y轴位置:取当日网速最大值的1.1倍,让文本显示在曲线上方 text_y_download = max(download, na.rm = TRUE)*1.1, text_y_upload = max(download, upload, na.rm = TRUE)*1.05 ) %>% ungroup() %>% ggplot(aes(x = datetime, y = download)) + geom_line(color = "blue") + geom_line(aes(y = upload), color = "red") + # 按日期分面 facet_wrap(~date, scales = "free_x") + # 添加下载均值文本 geom_text(aes(x = text_x, y = text_y_download, label = download_text), hjust = 1, vjust = 1, size = 3.5) + # 添加上传均值文本 geom_text(aes(x = text_x, y = text_y_upload, label = upload_text), hjust = 1, vjust = 1, size = 3.5) + labs(x = "时间", y = "网速(Mbps)") + theme_bw()
关键细节
- 用
as.Date(datetime)提取纯日期作为分面变量,分组计算的均值会自动匹配到对应日期的分面中 text_x使用max(datetime)保证为POSIXct类型,和主图x轴类型一致,彻底解决time_trans错误- 可通过调整
text_y_download和text_y_upload的系数,控制文本在分面中的垂直位置;若想把文本放在左上角,只需把text_x改为min(datetime),hjust设为0即可
内容的提问来源于stack exchange,提问作者Ginko-Mitten
相关产品推荐
相关产品推荐

