求助:使用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轴标题 )
关键改动说明
- 数据处理:用
mutate统一修正所有分类变量的因子水平,确保排序符合需求 - 数据汇总:新增
n = n()统计每个分组的样本量 - 绘图:加入
geom_text并通过hjust = -0.2将样本量文本放在点的右侧,避免遮挡;调整点大小让整体布局更协调
内容的提问来源于stack exchange,提问作者Sundown Brownbear
相关产品推荐
相关产品推荐

