R语言ggplot柱状图:合并Otros标签与调整排序需求
解决ggplot柱状图的两个问题
问题1:合并"Otros"类别并显示总和标签
原数据中"Otros"对应多行,导致柱状条上出现多个标签,需先对数据分组汇总,将所有"Otros"行的数值合并为总和。
问题2:降序排列且"Otros"固定在最后
调整因子顺序,让非"Otros"类别按gr_sum降序排列,再把"Otros"强制放在最后位置。
完整代码实现
library(tidyverse) # 1. 数据预处理:合并Otros类别并调整顺序 Cred_by_Prod_processed <- Cred_by_Prod %>% # 按Cat_top分组,计算每个类别的总和 group_by(Cat_top) %>% summarise( gr_sum = sum(gr_sum), prop = sum(prop) ) %>% ungroup() %>% # 调整因子顺序:非Otros按gr_sum降序,Otros放在最后 mutate( Cat_top = fct_reorder(Cat_top, -gr_sum), Cat_top = fct_relevel(Cat_top, "Otros", after = Inf) ) # 2. 绘制柱状图 ggplot(Cred_by_Prod_processed, aes(x = Cat_top, y = gr_sum)) + geom_bar(stat = "identity", alpha = .6, width = .4) + theme_bw() + coord_flip() + theme(axis.text.x = element_text(angle = 90)) + labs( title = "Colocaciones Finagro por Producto 2000-2021", x = "Cultivo", y = "Billones $COP" ) + # 显示总和数值标签 geom_label( aes(label = round(gr_sum, 1)), nudge_x = 0.1, nudge_y = -1, check_overlap = TRUE, label.padding = unit(0.1, "lines"), label.size = 0.0001, color = "black" ) + # 显示百分比标签 geom_label( aes(label = paste(round(prop * 100, 1), "%")), nudge_x = 0.1, nudge_y = 2, check_overlap = TRUE, color = "black", size = 3 )
关键说明
- 分组汇总:通过
group_by(Cat_top)和summarise将所有"Otros"行的gr_sum和prop合并为总和,确保每个类别只有一行数据,标签不再重复。 - 因子排序:
fct_reorder(Cat_top, -gr_sum)让非"Otros"类别按数值从大到小排列,fct_relevel强制把"Otros"放到最后位置。 - 标签绑定:绘图时
geom_label使用aes(label=...)绑定处理后的数据列,避免引用原数据导致的标签错位问题。
内容的提问来源于stack exchange,提问作者julian carreño
相关产品推荐
相关产品推荐

