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

求助:使用ggplot复现带样本量的Dot Plot并解决两个绘图问题

解决ggplot绘制Dot Plot的两个问题

问题1:调整变量水平顺序

默认因子水平按字符排序,导致coord_flip()后显示顺序反转。需要提前为变量指定正确的因子水平,确保从低到高排列:

  • 对pclass直接指定levels为c("1","2","3")
  • 对sibsp和parch,提取唯一值并按数字排序后作为levels

问题2:添加样本量N

在数据汇总阶段同时计算生存率和样本量,再用geom_text将样本量标注在每个点旁,避免遮挡。

修改后的完整代码

# Load dataset
library(rms)
library(tidyverse)
getHdata(titanic3)

# 修正变量格式与因子水平顺序
titanic3 <- titanic3 %>%
  mutate(
    pclass = factor(pclass, levels = c("1", "2", "3")),  # 指定pclass顺序为1,2,3
    sibsp = factor(sibsp, levels = sort(unique(as.character(sibsp)))),  # 按数字排序
    parch = factor(parch, levels = sort(unique(as.character(parch))))
  )

# 数据汇总:计算生存率+样本量
plot_data <- titanic3 %>%
  select(sex, pclass, survived, sibsp, parch) %>% 
  pivot_longer(cols = -survived) %>% 
  group_by(name, value) %>%
  summarise(
    survived_rate = mean(survived, na.rm = TRUE),
    n = n(),  # 统计每个分组的样本量
    .groups = "drop"
  )

# 绘图
ggplot(plot_data, aes(x = value, y = survived_rate, fill = value)) + 
  geom_point(size = 3) +  # 放大点提升可读性
  # 添加样本量文本,位置在点的右侧
  geom_text(aes(label = paste0("N=", n)), hjust = -0.2, size = 3) +
  coord_flip() +
  facet_wrap(~name, scales = "free_y", nrow = 4, strip.position = "top") +
  theme(
    panel.spacing = unit(0, "lines"),
    panel.border = element_rect(fill = NA),
    axis.title.y = element_blank(),
    legend.position = "none",
    strip.placement = "outside",
    axis.title.x = element_text(label = "Survival Rate")  # 可选:添加x轴标题
  )

关键改动说明

  1. 数据处理:用mutate统一修正所有分类变量的因子水平,确保排序符合需求
  2. 数据汇总:新增n = n()统计每个分组的样本量
  3. 绘图:加入geom_text并通过hjust = -0.2将样本量文本放在点的右侧,避免遮挡;调整点大小让整体布局更协调

内容的提问来源于stack exchange,提问作者Sundown Brownbear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:33:10