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

如何按最新年份数值排序geom_sankey_bump图例?

按最新年份数值排序桑基图图例的实现方法

要实现按最新年份对应数值排序图例,核心是把图例对应的分类变量转换成有序因子,并指定排序后的名称顺序。具体步骤如下:

1. 提取最新年份数据并排序得到名称顺序

先筛选出最新年份的记录,按Value(升序或降序)排序后提取Name,得到我们想要的图例顺序:

# 获取最新年份的数值排序后的Name列表
latest_year <- max(data$Year)
sorted_names <- data %>%
  filter(Year == latest_year) %>%
  arrange(desc(Value)) %>%  # 按数值降序排列,要升序就去掉desc()
  pull(Name)

2. 将分类变量转为有序因子

在处理桑基图数据时,把next_id(也就是图例对应的变量)转换成有序因子,指定levels为上面得到的sorted_names,这样ggplot会遵循这个顺序渲染图例:

data_sankey <- data %>%
  mutate(
    id = as.character(Year),  
    # 把next_id转为有序因子,指定排序后的levels
    next_id = factor(as.character(Name), levels = sorted_names, ordered = TRUE),   
    value = Value                 
  )

3. 用命名向量绑定颜色(可选但更稳妥)

为了确保颜色和排序后的名称一一对应,建议把颜色向量改成命名向量,避免因顺序变动导致颜色错位:

# 生成对应排序后名称的颜色命名向量
farben <- setNames(
  colorRampPalette(brewer.pal(12, "Set3"))(length(sorted_names)),
  sorted_names
)

完整修改后的代码

library(dplyr)
library(ggsankey)
library(RColorBrewer)  # 补充加载brewer.pal依赖的包

# Variables
set.seed(123) 
years <- rep(2015:2024, each = 5)  
names <- c("Alice", "Bob", "Charlie", "Diana", "Eve")  
values <- runif(length(years), min = 10, max = 100)  

# DataFrame
data <- data.frame(
  Year = years,
  Name = rep(names, times = length(unique(years))),
  Value = round(values, 2)  
)

# 1. 获取最新年份排序后的Name顺序
latest_year <- max(data$Year)
sorted_names <- data %>%
  filter(Year == latest_year) %>%
  arrange(desc(Value)) %>%
  pull(Name)

# 2. 处理桑基图数据,将next_id转为有序因子
data_sankey <- data %>%
  mutate(
    id = as.character(Year),  
    next_id = factor(as.character(Name), levels = sorted_names, ordered = TRUE),   
    value = Value                 
  )

# 3. 生成对应排序后名称的颜色命名向量
farben <- setNames(
  colorRampPalette(brewer.pal(12, "Set3"))(length(sorted_names)),
  sorted_names
)

p1 <- ggplot(data_sankey, aes(
  x = id,          
  next_x = next_id, 
  node = next_id,   
  fill = next_id,   
  value = value    
)) +
  geom_sankey_bump(
    width = 0.3,     
    color = "black"  
  ) +
  scale_fill_manual(values = farben) + 
  theme_minimal() +
  theme(
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    axis.text.x = element_text(angle = 90, hjust = 1),
    legend.position = "right",  
    legend.title = element_blank(),  
    legend.text = element_text(size = 10)  
  )

print(p1)

这样修改后,图例就会按照最新年份的Value降序(或你指定的顺序)排列,能更直观地展示数值大小对应的类别顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:11:18