GAM绘图:log10变换下geom_smooth置信区间显示与配色问题
解决方案
问题1:tidymv::geom_smooth_ci置信区间配色不生效
geom_smooth_ci的线条用color美学映射,置信区间用fill美学映射,你之前只设置了颜色尺度,没有设置填充尺度。只需同时映射color和fill到class,并分别调用viridis的颜色和填充尺度即可:
# 先修正预测数据集的变量名(可选,但更清晰) pred.class.1 <- predict_gam(mod.1) %>% rename(log_area = `log10(area)`) %>% mutate(class = "Class 1") pred.class.2 <- predict_gam(mod.2) %>% rename(log_area = `log10(area)`) %>% mutate(class = "Class 2") dataset <- rbind(pred.class.1, pred.class.2) # 绘图 ggplot(dataset, aes(x = log_area, y = fit, color = class, fill = class)) + tidymv::geom_smooth_ci() + # 设置x轴为log10尺度,对应原始area的1/10/100 scale_x_continuous(trans = "log10", breaks = c(0,1,2), labels = c("1", "10", "100")) + # y轴也设置为log10尺度 scale_y_continuous(trans = "log10") + # 线条用viridis离散配色 scale_color_viridis(discrete = TRUE) + # 置信区间用viridis离散配色,添加透明度 scale_fill_viridis(discrete = TRUE, alpha = 0.3) + labs(x = "Area", y = "Value") + theme_bw()
问题2:geom_smooth加scale_x_log10后置信区间消失
出现这个问题的核心原因是:你手动拟合的GAM模型用的是log10(area)作为自变量,但直接用geom_smooth时,默认会对原始area重新拟合模型,当添加scale_x_log10()后,x轴的尺度变换会把原始拟合的置信区间压缩到几乎不可见。
有两种解决方式:
方式1:用预先生成的预测数据集绘图(推荐,可控性更高)
直接使用你已经生成的dataset,用geom_ribbon绘制置信区间,geom_line绘制拟合线条,完全自定义样式:
ggplot(dataset, aes(x = log_area, color = class, fill = class)) + # 先画置信区间(避免被线条覆盖) geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.3) + # 再画拟合线条 geom_line(aes(y = fit), linewidth = 1) + scale_x_continuous(trans = "log10", breaks = c(0,1,2), labels = c("1", "10", "100")) + scale_y_continuous(trans = "log10") + scale_color_viridis(discrete = TRUE) + scale_fill_viridis(discrete = TRUE) + labs(x = "Area", y = "Value") + theme_bw()
方式2:让geom_smooth调用和你手动拟合一致的GAM模型
在geom_smooth中明确指定公式,对x做log10变换,确保拟合逻辑和手动模型一致:
# 先合并原始数据 original_data <- bind_rows( data.class.1 %>% mutate(class = "Class 1", value = value.1), data.class.2 %>% mutate(class = "Class 2", value = value.2) ) # 绘图 ggplot(original_data, aes(x = area, y = value, color = class, fill = class)) + geom_point(alpha = 0.5) + # 指定GAM方法和对应公式 geom_smooth(method = "gam", formula = y ~ s(log10(x), k=3), alpha = 0.3) + scale_x_log10() + scale_y_log10() + scale_color_viridis(discrete = TRUE) + scale_fill_viridis(discrete = TRUE) + labs(x = "Area", y = "Value") + theme_bw()
内容的提问来源于stack exchange,提问作者Online Browser
相关产品推荐
相关产品推荐

