ggplot2使用geom_line绘制分类变量各取值年度占比的实现方法
你当前直接在geom_line的fun参数里传函数无法实现需求,核心原因是stat="summary"的计算分组是year(x轴变量)+你在aes中指定的group=state_crossing,每个计算组内只有同一个州同年的观测,拿不到当年所有观测的总数量,自然没法算占比。更稳妥易读的方案是先对原始数据做汇总计算后再绘图,示例代码如下:
library(dplyr) library(ggplot2) # 原始数据 plotting <- data.frame( year = rep(c("2001", "2002"), times=c(4,5)), state_crossing = c("baja california", "baja california", "sonora", "tamaulipas", "sonora", "sonora", "tamaulipas", "tamaulipas", "baja california"), value = rep(1, 9) ) # 汇总计算每年每个州的观测占比 plotting_summary <- plotting %>% # 先按年份分组,统计每年总观测数 group_by(year) %>% mutate(year_total = n()) %>% # 再按年份+州分组,计算对应占比 group_by(year, state_crossing) %>% summarise(prop = n() / first(year_total), .groups = "drop") # 绘图 ggplot(plotting_summary, aes(x = year, y = prop, color = state_crossing, group = state_crossing)) + geom_line()
如果需要让没有观测的州对应年份占比显示为0而非断线,可以额外用tidyr::complete补全年份和州的所有组合,将缺失的占比填充为0即可。
内容的提问来源于stack exchange,提问作者jpugliese
相关产品推荐
相关产品推荐

