如何用ggplot2绘制符合要求的四分位数堆叠柱状图?
解决ggplot2复刻四分位数分类堆叠柱状图的问题
核心思路:用geom_col替代默认geom_bar,先做好数据分组预处理
1. 第一步:对原始数据做四分位数分组统计
先把收益率/利差数据按四分位数拆分,计算你需要展示的指标(比如分组占比、区间范围):
library(dplyr) library(ggplot2) # 假设原始数据为df,包含return(收益率/利差)列,若有分类变量比如asset(资产类别)可保留 df_processed <- df %>% # 生成四分位数分组标签(1-4分位,可自定义标签) mutate(Quartile = factor(ntile(return, 4), labels = c("Q1", "Q2", "Q3", "Q4"))) %>% # 按分类变量+四分位分组统计 group_by(asset, Quartile) %>% # 计算每个分组的观测占比(可替换为区间长度等你需要的指标) summarize(Percent = n() / nrow(df) * 100, .groups = "drop")
2. 第二步:用geom_col绘制堆叠柱状图
geom_col会直接使用你指定的y轴数值,不会像默认geom_bar那样自动求和,完美匹配堆叠需求:
ggplot(df_processed, aes(x = asset, y = Percent, fill = Quartile)) + geom_col(position = "stack") + # position="stack"是默认堆叠模式,可省略 labs(title = "不同资产收益率四分位占比堆叠图", x = "资产类别", y = "占比(%)", fill = "四分位数") + theme_minimal()
3. 若需展示四分位区间范围的堆叠图
如果你的需求是展示每个四分位的数值区间(比如Q1的最小值到25分位值),可以先计算区间上下限和长度,再堆叠:
# 计算四分位区间统计量 df_range <- df %>% summarize( q0 = quantile(return, 0), q25 = quantile(return, 0.25), q50 = quantile(return, 0.5), q75 = quantile(return, 0.75), q100 = quantile(return, 1) ) %>% tidyr::pivot_longer(cols = everything(), names_to = "quantile", values_to = "value") %>% mutate( Quartile = factor(c("Q1", "Q1", "Q2", "Q3", "Q4"), labels = c("Q1", "Q2", "Q3", "Q4")), range = value - lag(value, default = first(value)) ) %>% filter(!is.na(range)) # 绘制区间堆叠图 ggplot(df_range, aes(x = "收益率区间", y = range, fill = Quartile)) + geom_col(position = "stack") + geom_text(aes(y = cumsum(range) - range/2, label = paste0(lag(value), "~", value)), color = "white") + labs(title = "收益率四分位区间堆叠图", y = "区间长度", fill = "四分位数") + theme_minimal()
关于geom_boxplot的补充
如果只是想展示四分位分布,而非堆叠柱状图,按四分位填充颜色很简单,直接映射fill参数即可:
ggplot(df, aes(x = factor(1), y = return, fill = factor(ntile(return, 4)))) + geom_boxplot(position = "dodge") + labs(fill = "四分位数")
内容的提问来源于stack exchange,提问作者Tanga94
相关产品推荐
相关产品推荐

