如何在R的ggplot2中设置堆叠条形图顶部统一灰色、底部按队设独色?
解决ggplot2堆叠条形图按队伍自定义底部颜色的问题
你当前代码的问题在于fill仅映射了run_pass,导致scale_fill_manual只能给两类进攻分配固定颜色——所有顶部条形用灰色,所有底部条形共用d$team_color的第一个值,无法区分不同队伍。
要实现每个队伍底部条形用专属颜色、顶部统一灰色的效果,需要把填充标识和队伍绑定,具体步骤如下:
1. 构建专属颜色映射向量
先提取队伍与颜色的唯一对应关系,再针对每个「进攻类型+队伍」的组合分配颜色:
# 获取队伍缩写与颜色的唯一匹配表 team_color_map <- unique(d[, c("possession_abbr", "team_color")]) # 生成所有填充类别(进攻类型+队伍的组合) fill_groups <- levels(interaction(d$run_pass, d$possession_abbr)) # 给每个组合分配颜色:顶部进攻(假设是"Pass")统一灰色,底部进攻("Run")用对应队伍颜色 fill_colors <- ifelse( grepl("^Pass\\.", fill_groups), # 匹配以"Pass."开头的组合 "grey", # 提取队伍缩写,匹配对应的team_color team_color_map$team_color[match(sub("Run\\.", "", fill_groups), team_color_map$possession_abbr)] ) # 给颜色向量命名,确保与填充类别一一对应 names(fill_colors) <- fill_groups
2. 修改ggplot代码
把fill映射改为「进攻类型+队伍」的组合,再传入自定义颜色向量,同时还原图例标签:
stack <- ggplot(d, aes(x=possession_abbr, y=count, fill=interaction(run_pass, possession_abbr)) )+ geom_col(position = "fill") + scale_fill_manual( values = fill_colors, # 将图例标签还原为原始的"Run"或"Pass" labels = function(x) sub("\\..*", "", x) ) + scale_y_continuous(labels = scales::percent) + labs( title = "Proportion of Pass and Run Plays for Each Team", subtitle = "(2022 Season)", x= "", y= "Proportion of Plays", fill = "Run or Pass" )
注意事项
如果你的顶部进攻类型是"Run"而非"Pass",只需调整代码中的匹配规则:
- 将
grepl("^Pass\\.", fill_groups)改为grepl("^Run\\.", fill_groups) - 将
sub("Run\\.", "", fill_groups)改为sub("Pass\\.", "", fill_groups)
内容的提问来源于stack exchange,提问作者garmar
相关产品推荐
相关产品推荐

