如何按最新年份数值排序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
相关产品推荐
相关产品推荐

