如何在R的ggplot2小提琴图上叠加名称不匹配的模拟真实值?
解决模拟真实值与模拟值小提琴图叠加的名称匹配问题
核心问题是真实值(b1、b3)和模拟值(mrdoc2_b1_hat、mrdoc2_b3_hat)的x轴标签不匹配,导致无法对应叠加。解决思路是给真实值映射到对应模拟值的x轴标识,具体代码修改如下:
步骤1:预处理数据,统一分组标识
在数据透视后,新增列将真实值与对应模拟值的x标签绑定:
# 创建绘图数据框并预处理 plot_data <- bias %>% select(mrdoc2_b1_hat, b1, mrdoc2_b3_hat, b3) %>% select(!contains("_se")) %>% pivot_longer(cols = everything(), names_to = "key", values_to = "value") %>% # 给真实值匹配对应模拟值的x轴标签,同时标记数据类型 mutate( param = case_when( str_detect(key, "b1") ~ "mrdoc2_b1_hat", str_detect(key, "b3") ~ "mrdoc2_b3_hat", TRUE ~ key ), type = ifelse(str_detect(key, "_hat$"), "模拟值", "真实值") )
步骤2:绘制叠加图(优先细水平线)
修改ggplot代码,让真实值对应到模拟值的x轴位置,叠加水平线或点:
# 生成包含真实值的小提琴图 ggplot() + # 绘制模拟值的小提琴图 geom_violin(data = plot_data %>% filter(type == "模拟值"), aes(x = param, y = value), trim = TRUE, scale = "width") + # 叠加箱线图 geom_boxplot(data = plot_data %>% filter(type == "模拟值"), aes(x = param, y = value), width = 0.19, fill = "white") + # 叠加真实值的细水平线(优先选择) geom_hline(data = plot_data %>% filter(type == "真实值") %>% distinct(param, value), aes(yintercept = value, color = "真实值"), linetype = "dashed", linewidth = 0.8) + # 如果需要用点代替水平线,注释上面的geom_hline,取消下面的注释 # geom_point(data = plot_data %>% filter(type == "真实值"), # aes(x = param, y = value, color = "真实值"), size = 3) + # 设置颜色图例 scale_color_manual(values = c("真实值" = "red")) + theme_luis() + theme(legend.position = "bottom")
关键说明
- 通过
mutate创建的param列,将b1映射到mrdoc2_b1_hat、b3映射到mrdoc2_b3_hat,确保真实值能对应到模拟值的x轴位置。 - 修正了原代码中
geom_violin、geom_boxplot多余的闭合括号语法错误。 geom_hline用虚线绘制真实值水平线,若偏好点标记可替换为geom_point。
内容的提问来源于stack exchange,提问作者lf_araujo
相关产品推荐
相关产品推荐

