You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggalluvial冲积图优化:拆分大类别与调整图例标签大小

解决冲积图的两个适配问题

问题1:主变量index的A1、A2类别规模过大挤压其余类别

针对该问题,提供两种可行解决办法:

方案1:对y轴进行对数变换

由于数据存在freq=0的情况,先给freq加极小值避免对数报错,再通过对数变换压缩大类别占比,同时还原原始数值标签:

library(ggplot2)
library(ggalluvial)

ggplot(data = sni_long, 
       aes(axis1 = index, axis2 = Avdelning, y = freq + 1)) + 
  geom_alluvium(aes(fill = Avdelning)) + 
  geom_stratum() + 
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) + 
  scale_x_discrete(limits = c("Index", "Avdelning"), expand = c(0.15, 0.05)) +
  scale_y_log10(labels = function(x) x - 1) +
  theme_void()

方案2:拆分index为多轴分层展示

将index按规模分组,通过新增中间轴分散大类别占比,避免小类别被挤压:

library(ggplot2)
library(ggalluvial)

# 给index按规模分组
sni_long$index_group <- ifelse(sni_long$index %in% c("A1", "A2"), "Large", "Small")

ggplot(data = sni_long, 
       aes(axis1 = index_group, axis2 = index, axis3 = Avdelning, y = freq)) + 
  geom_alluvium(aes(fill = Avdelning)) + 
  geom_stratum() + 
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) + 
  scale_x_discrete(limits = c("Group", "Index", "Avdelning"), expand = c(0.1, 0.05)) +
  theme_void()

问题2:Avdelning类别过多导致图例溢出

提供两种优化图例的方案:

方案1:调整图例为多列并放置于底部

通过设置图例排列方式和位置,避免溢出:

library(ggplot2)
library(ggalluvial)

ggplot(data = sni_long, 
       aes(axis1 = index, axis2 = Avdelning, y = freq)) + 
  geom_alluvium(aes(fill = Avdelning)) + 
  geom_stratum() + 
  geom_text(stat = "stratum", aes(label = after_stat(stratum))) + 
  scale_x_discrete(limits = c("Index", "Avdelning"), expand = c(0.15, 0.05)) +
  theme_void() +
  theme(
    legend.position = "bottom",
    legend.direction = "horizontal",
    legend.text = element_text(size = 8),
    legend.key.size = unit(0.5, "cm")
  ) +
  guides(fill = guide_legend(ncol = 4))

方案2:移除图例,直接在轴上标注Avdelning类别

完全替代图例,将类别标签直接放在对应轴的分层块上:

library(ggplot2)
library(ggalluvial)

ggplot(data = sni_long, 
       aes(axis1 = index, axis2 = Avdelning, y = freq)) + 
  geom_alluvium(aes(fill = Avdelning)) + 
  geom_stratum() + 
  # 标注index轴类别
  geom_text(stat = "stratum", aes(label = after_stat(stratum)), subset = .(x == 1), size = 3.5) +
  # 标注Avdelning轴类别,替代图例
  geom_text(stat = "stratum", aes(label = after_stat(stratum)), subset = .(x == 2), size = 3.5) +
  scale_x_discrete(limits = c("Index", "Avdelning"), expand = c(0.15, 0.05)) +
  theme_void() +
  theme(legend.position = "none")

内容的提问来源于stack exchange,提问作者Chrysa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:20:37