在ggplot2中按年份绘制缓解人群比例的图表实现问题
绘制每年缓解人群比例的ggplot2实现方案
问题描述
需要绘制治疗后每年处于缓解状态(二元变量0/1)人群的比例图,X轴为年份,Y轴为缓解比例,分别用geom_bar和geom_line实现。数据结构如下:
| Client_id | Year | Remission |
|---|---|---|
| 2 | 2016 | 0 |
| 4 | 2017 | 1 |
| 7 | 2017 | 0 |
| 8 | 2016 | 1 |
| 12 | 2016 | 1 |
原代码尝试用geom_bar但结果错误,每年比例都显示为1.00:
ggplot(data=df)+ geom_bar(aes(x=Year,y=Remission),stat="identity",position="dodge")
解决方案
原代码错误原因:stat="identity"会直接使用Remission的原始0/1值而非计算比例,需通过统计计算或数据预处理得到每年的缓解比例。
1. 使用geom_bar绘制比例柱状图
方法一:直接用stat_summary计算均值(0/1变量的均值即比例)
library(ggplot2) ggplot(data = df) + geom_bar(aes(x = factor(Year), y = Remission), stat = "summary", fun = "mean", width = 0.6) + # 调整柱子宽度更美观 scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + # 显示百分比标签 labs(x = "年份", y = "缓解人群比例")
方法二:先预处理数据再绘图(需dplyr包)
library(ggplot2) library(dplyr) # 计算每年缓解比例 df_summary <- df %>% group_by(Year) %>% summarise(Remission_rate = mean(Remission)) ggplot(data = df_summary) + geom_bar(aes(x = factor(Year), y = Remission_rate), stat = "identity", width = 0.6) + scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + labs(x = "年份", y = "缓解人群比例")
2. 使用geom_line绘制比例折线图
方法一:直接用stat_summary计算均值
library(ggplot2) ggplot(data = df) + stat_summary(aes(x = Year, y = Remission), fun = "mean", geom = "line", group = 1, linewidth = 1) + # group=1确保线连续 stat_summary(aes(x = Year, y = Remission), fun = "mean", geom = "point", size = 3) + # 添加数据点增强可读性 scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + labs(x = "年份", y = "缓解人群比例")
方法二:用预处理后的数据绘图
library(ggplot2) library(dplyr) df_summary <- df %>% group_by(Year) %>% summarise(Remission_rate = mean(Remission)) ggplot(data = df_summary) + geom_line(aes(x = Year, y = Remission_rate), group = 1, linewidth = 1) + geom_point(aes(x = Year, y = Remission_rate), size = 3) + scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + labs(x = "年份", y = "缓解人群比例")
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

