ggplot绘制堆叠面积图如何反转区域位置实现100%全幅填充
问题说明
需要实现参考效果的100%堆叠面积图:
参考堆叠面积图效果
初始实现代码如下:
ggplot(eth_txs2, aes(x=date))+ geom_area(aes(y=eth_percent, group = 1), color = "blue", fill = "blue")+ geom_area(aes(y=opt_percent, group = 1), color = "red", fill = "red")+ geom_area(aes(y=arb_percent, group = 1), color = "lightblue", fill = "lightblue")
使用数据集结构参考:
数据集样例
初始代码运行输出的图表存在灰色空白,无法占满100%绘图区域:
实际运行错误效果
需要调整参数、反转区域绘制顺序,消除空白,输出和参考一致的效果。
故障原因
当前写法是独立叠加三个互不关联的面积图层,不符合ggplot堆叠面积图的语法逻辑:
- 每个
geom_area图层默认从y=0位置开始填充,三层互相覆盖,不会自动做累加堆叠偏移 - 未将分类维度映射给填充属性,ggplot无法识别分组关系,不会自动计算每层的堆叠起始高度
- 绘制顺序未做适配,最终就会出现未被填充的空白区域。
修复方案
按以下两步调整即可:
- 将宽格式数据集转换为长格式,把三个百分比字段收拢为「链分类」+「占比值」两个字段,通过
position = "stack"参数让ggplot自动计算堆叠位置 - 通过调整因子水平反转堆叠顺序,同时关闭y轴默认边距,让图形完全占满绘图区域。
修复后可直接运行的代码:
library(tidyverse) # 宽表转长表,适配ggplot分组绘图语法 eth_txs_long <- eth_txs2 %>% pivot_longer( cols = c(eth_percent, opt_percent, arb_percent), names_to = "chain", values_to = "percent" ) %>% # 反转因子水平,调整堆叠顺序匹配参考图效果 mutate(chain = fct_rev(chain)) # 绘制标准100%堆叠面积图 ggplot(eth_txs_long, aes(x = date, y = percent, fill = chain)) + geom_area(position = "stack", linewidth = 0.2) + # 手动指定填充色,和初始代码的颜色设置保持一致 scale_fill_manual( values = c( "eth_percent" = "blue", "opt_percent" = "red", "arb_percent" = "lightblue" ) ) + # 移除y轴默认扩展边距,让图形上下完全贴合绘图区边界 scale_y_continuous(expand = c(0, 0))
前置校验:同一日期下三个占比值的和需要等于1(即100%),如果原始数据加总不为1,需要先做归一化处理,否则无法实现完全填满的100%堆叠效果。
内容的提问来源于stack exchange,提问作者squirrel
相关产品推荐
相关产品推荐

