You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:42:36