R新手求助:在ggplot2中绘制日均温的置信区间
问题原因与解决方案
核心问题
你的代码无法展示置信区间,是因为每个Date仅对应唯一的mean_temp值。mean_cl_normal函数需要同一分组下存在多个观测值,才能基于正态分布计算均值的置信区间——单值分组没有样本波动,自然无法生成置信区间范围。
解决方案分两种场景:
场景1:你有原始温度观测数据(非聚合后的日均数据)
如果你的数据集里包含每日的多组温度观测(比如小时级数据),直接用stat_summary分别绘制均值折线和置信区间带即可:
library(ggplot2) # 假设raw_data是包含Date(日期)和temp(原始温度)的数据集 ggplot(raw_data, aes(x = Date, y = temp)) + # 绘制日均温度折线 stat_summary(geom = "line", fun = mean, color = "black", linewidth = 1) + # 绘制95%置信区间带 stat_summary(geom = "ribbon", fun.data = mean_cl_normal, fun.args = list(conf.int = 0.95), alpha = 0.5, fill = "gray60") + labs(x = "日期", y = "日均温度", title = "四个月日均温度与95%置信区间")
场景2:只有当前聚合后的日均数据
如果没有原始观测,你可以选择按更大的时间周期(比如周/月)分组,计算周期内的均值与置信区间:
library(ggplot2) library(dplyr) library(lubridate) # 按周分组,计算周均温与95%置信区间 period_data <- DailyAvgL5 %>% mutate(week = floor_date(Date, "week")) %>% # 将日期归到每周首日 group_by(week) %>% summarize( mean_temp = mean(mean_temp), # 用t分布计算置信区间(样本量小时更准确) ci_low = mean_temp - qt(0.975, n()-1)*sd(mean_temp)/sqrt(n()), ci_high = mean_temp + qt(0.975, n()-1)*sd(mean_temp)/sqrt(n()) ) # 绘制周期均值折线+置信区间 ggplot(period_data, aes(x = week, y = mean_temp)) + geom_line(color = "black", linewidth = 1) + geom_ribbon(aes(ymin = ci_low, ymax = ci_high), alpha = 0.5, fill = "gray60") + labs(x = "周", y = "周均温度", title = "四个月周均温度与95%置信区间")
关于z_scoremean_temp的可视化
如果要展示标准化温度的置信区间,只需将上述代码中的mean_temp替换为z_scoremean_temp即可,逻辑完全一致:
# 示例:按周计算z_score的置信区间 z_period_data <- DailyAvgL5 %>% mutate(week = floor_date(Date, "week")) %>% group_by(week) %>% summarize( z_mean = mean(z_scoremean_temp), ci_low = z_mean - qt(0.975, n()-1)*sd(z_scoremean_temp)/sqrt(n()), ci_high = z_mean + qt(0.975, n()-1)*sd(z_scoremean_temp)/sqrt(n()) ) ggplot(z_period_data, aes(x = week, y = z_mean)) + geom_line(color = "darkblue", linewidth = 1) + geom_ribbon(aes(ymin = ci_low, ymax = ci_high), alpha = 0.5, fill = "lightblue")
内容的提问来源于stack exchange,提问作者Matt Schaaf
相关产品推荐
相关产品推荐

