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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:45:01