ggplot2绘制时间序列平滑曲线时95%置信区间不显示如何解决
解决方案
问题根因
geom_smooth()的参数存在语法错误,level参数前多余的反引号会导致参数解析异常,置信区间相关配置无法生效- 未显式声明
se=TRUE参数,虽然该参数默认值为TRUE,显式声明可避免R版本、环境适配导致的异常 - 未指定平滑方法与公式,默认的自动适配逻辑在部分时间序列数据场景下可能出现置信区间计算失败的问题
- 未指定置信区间填充样式,可能出现填充色与
theme_light()的白色背景重合导致无法目视识别的情况 - 额外注意:你使用
t作为数据框变量名,而R内置t()为转置函数,命名冲突可能导致非预期的运算异常,建议更换为df等自定义变量名
修正后代码
library(lubridate) library(tidyverse) months_order <- c(7:12,1:6) dates <- make_datetime(c(rep(3,6), rep(4,6)), months_order) # 建议将原变量t更换为df,避免和内置转置函数t()冲突 df %>% mutate(datetime = make_datetime(year, month, day, hour, minute, second)) %>% filter(datetime >= make_datetime(2018,7), datetime < make_datetime(2020,7)) %>% group_by(year, month) %>% mutate(dummy = month(datetime) == 7 & datetime == min(datetime)) %>% ungroup() %>% mutate(dummy = cumsum(dummy)) %>% group_by(dummy) %>% mutate(datetime = datetime - years(year - 4) - years(month>=7), years = paste(unique(year), collapse = " / ")) %>% ungroup() %>% ggplot() + geom_line(aes(x = datetime, y = T42, colour = years)) + scale_x_datetime(breaks = dates, labels = month.abb[months_order]) + labs(colour = "Year") + # 修正后的geom_smooth配置,显式指定se、填充色、平滑方法等参数 geom_smooth(aes(x=datetime,y=T42), se = TRUE, level = 0.95, color = "black", fill = "grey50", alpha = 0.3, method = "loess", formula = y ~ x) + theme_light() + xlab("Time (Months)") + ylab("Temperature (°C)") + geom_hline(yintercept=5, linetype="dashed", color = "black",lwd=1) + scale_color_manual(values=c("grey","grey","red"))
补充说明
如果你的数据量大于1000条,可将method参数改为"gam",对应formula改为y ~ s(x),计算效率更高。如果调整后仍无置信区间,可先移除其他图层仅保留geom_smooth测试,排除其他图层的样式覆盖问题。
内容的提问来源于stack exchange,提问作者Gonzalo de Quesada
相关产品推荐
相关产品推荐

