能否为dwplot手动设置颜色,按系数显著性与正负跨模型着色?
可行,具体实现步骤如下
dwplot本质是基于ggplot2的绘图函数,完全可以自定义颜色映射来实现你需要的效果,具体操作分两种方式:
方式一:修改已生成的dwplot对象
如果你已经用p <- dwplot(list(mod1976,mod1980,mod1984))生成了绘图对象,可以直接提取其数据并添加颜色分组:
library(dplyr) library(ggplot2) # 提取绘图数据 plot_data <- p$data # 添加颜色分组变量:根据系数正负和显著性(以p<0.05为例) plot_data <- plot_data %>% mutate( color_group = case_when( estimate > 0 & p.value < 0.05 ~ "正且显著", estimate < 0 & p.value < 0.05 ~ "负且显著", TRUE ~ "不显著" ) ) # 修改原绘图的颜色映射 p_updated <- p + aes(color = color_group) + scale_color_manual( values = c("正且显著" = "green", "负且显著" = "red", "不显著" = "gray"), name = "系数状态" ) # 查看修改后的图 print(p_updated)
方式二:手动整理数据后绘图(更灵活)
如果你希望从源头控制数据,可以先提取所有模型的系数和显著性信息,再传入dwplot:
library(dotwhisker) library(broom) library(dplyr) # 提取每个模型的系数、p值,并添加年份标识 tidy_1976 <- tidy(mod1976) %>% mutate(model_year = 1976) tidy_1980 <- tidy(mod1980) %>% mutate(model_year = 1980) tidy_1984 <- tidy(mod1984) %>% mutate(model_year = 1984) # 合并所有模型数据 combined_tidy <- bind_rows(tidy_1976, tidy_1980, tidy_1984) # 创建颜色分组变量 combined_tidy <- combined_tidy %>% mutate( color_group = case_when( estimate > 0 & p.value < 0.05 ~ "正且显著", estimate < 0 & p.value < 0.05 ~ "负且显著", TRUE ~ "不显著" ) ) # 用dwplot绘图,指定颜色映射 dwplot(combined_tidy, x = "estimate", y = "term", color = "color_group") + scale_color_manual( values = c("正且显著" = "green", "负且显著" = "red", "不显著" = "gray"), name = "系数状态" ) + facet_wrap(~model_year) # 可选:按年份分面展示不同模型
注意事项
- 确保你的模型对象能被
broom::tidy()正确提取p值,如果是特殊模型(如生存分析模型),可能需要调整tidy()的参数(比如exponentiate = FALSE)。 - 你可以根据需求调整显著性阈值(比如把
p.value < 0.05改成p.value < 0.01)。
内容的提问来源于stack exchange,提问作者michael joseph
相关产品推荐
相关产品推荐

