如何用R语言ggplot绘制血压分组生存占比百分比直方图
用R的ggplot绘制血压分组生存情况图表
步骤1:加载必备工具包
先装tidyverse包(第一次用才需要运行安装代码),它包含数据处理的dplyr和绘图的ggplot2,新手一次加载就能搞定大部分需求:
# 安装包(首次使用执行) install.packages("tidyverse") # 加载包 library(tidyverse)
步骤2:导入你的CSV数据
假设你的数据文件叫data.csv,放在当前工作目录里,用下面代码导入,顺便检查数据结构:
# 导入数据 df <- read_csv("data.csv") # 查看变量类型,确认血压是数值型、survived是"是/否"格式 str(df)
注:如果
survived存的是0/1,先转成"是/否":df$survived <- ifelse(df$survived == 1, "是", "否")
步骤3:给血压按10mmHg间隔分组
用cut()函数把连续血压切成10mmHg一段的组,自动适配你的数据范围:
# 生成10mmHg间隔的断点,比如从最低血压的整十数到最高血压的整十数 bp_breaks <- seq(from = floor(min(df$血压, na.rm = TRUE)/10)*10, to = ceiling(max(df$血压, na.rm = TRUE)/10)*10, by = 10) # 新增分组变量`bp_group`,区间左闭右开(比如[60,70)表示60≤血压<70) df <- df %>% mutate(bp_group = cut(血压, breaks = bp_breaks, include.lowest = TRUE, right = FALSE))
步骤4:统计各组的生存数据
用分组统计功能,算出每组总人数、生存人数、生存占比:
stats_df <- df %>% group_by(bp_group) %>% summarize( 总人数 = n(), 生存人数 = sum(survived == "是", na.rm = TRUE), 生存占比 = 生存人数 / 总人数 )
步骤5:用ggplot绘图
选项1:展示生存人数(柱状图)
ggplot(stats_df, aes(x = bp_group, y = 生存人数)) + geom_col(fill = "#2E86AB", width = 0.7) + # 设置柱子颜色和宽度 geom_text(aes(label = 生存人数), vjust = -0.5) + # 在柱子上方标数值 labs( x = "血压分组(mmHg)", y = "生存人数", title = "不同血压分组患者生存人数分布" ) + theme_bw() + # 用简洁的白色主题 theme(axis.text.x = element_text(angle = 45, hjust = 1)) # X轴标签旋转45度,避免重叠
选项2:展示生存占比(柱状图)
如果要展示占比,把Y轴换成生存占比,还能转成百分比格式:
ggplot(stats_df, aes(x = bp_group, y = 生存占比)) + geom_col(fill = "#F24C4C", width = 0.7) + geom_text(aes(label = sprintf("%.1f%%", 生存占比*100)), vjust = -0.5) + # 显示百分比数值 labs( x = "血压分组(mmHg)", y = "生存占比", title = "不同血压分组患者生存占比分布" ) + scale_y_continuous(labels = scales::percent) + # Y轴显示百分比 theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
小提示
- 数据有缺失值的话,
na.rm = TRUE会自动忽略,避免统计出错 - 血压分组的断点可以手动指定,比如
bp_breaks = c(60,70,80,...,180),根据你的数据范围调整 - 要是想同时展示生存和死亡人数的对比,可以做堆叠柱状图,需要的话可以再调整代码
内容的提问来源于stack exchange,提问作者Shad
相关产品推荐
相关产品推荐

