在R的ggplot中按Team列最高占比设置X轴标签
解决方法
要实现将X轴的No标签替换为对应分组内value总和最高的Team名称,核心是先计算每个No对应的最优Team,再通过命名向量精准映射标签。以下是完整步骤:
1. 计算每个No对应的Top Team
首先统计每个No下各Team的value总和,筛选出总和最高的Team,并转换为命名向量(确保No与Team一一对应):
library(tidyverse) # 计算每个No分组中value总和最高的Team top_team_per_no <- df_long %>% ungroup() %>% group_by(No, Team) %>% summarise(total_value = sum(value), .groups = "drop") %>% # 按No和Team求和 group_by(No) %>% filter(total_value == max(total_value)) %>% # 筛选总和最高的Team slice(1) %>% # 处理平局:取第一个出现的Team deframe() # 转换为命名向量(名称为No,值为Team)
2. 绘制带自定义标签的柱状图
使用上述命名向量替换X轴标签,确保每个No对应正确的Team名称:
cbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7") ggplot(data = df_long, mapping = aes(x = No, y = value, fill = col)) + geom_bar(stat = 'identity', position = 'fill', width = 1) + scale_fill_manual(values = cbPalette) + scale_y_continuous(expand = c(0, 0)) + scale_x_discrete(labels = top_team_per_no) + # 使用命名向量替换标签 theme(axis.text.x = element_text(angle = 90, vjust = 0.5))
关键说明
- 命名向量的优势:避免因
No因子顺序与distinct()结果顺序不一致导致的标签错位,确保每个No精准匹配对应Team。 - 平局处理:若同一
No下多个Team的value总和相同,slice(1)会选取第一个出现的Team;如需自定义平局逻辑,可修改此步骤(如按字母排序选取)。 - 若需基于单个
value最大值而非总和,将summarise(total_value = sum(value))改为summarise(max_value = max(value))即可。
内容的提问来源于stack exchange,提问作者Roq
相关产品推荐
相关产品推荐

