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

ggplot2分面图替换X轴文本为对应球队Logo的实现问题

解决分面图X轴Logo与场次不匹配的问题

问题现状

使用facet_wrap()绘制多场比赛的概率分面图,要求每个分面的X轴呈现「主队Logo - Nul - 客队Logo」的对应样式,但当前所有分面的X轴都重复显示了labels字段的前三个内容,无法匹配各场次的球队Logo。

问题原因

当前scale_x_discrete(label = labels)是将全局的labels向量直接应用给所有分面的X轴标签,但每个分面的type(Domicile/Nul/Extérieur)需要对应本场次的专属球队Logo,全局赋值会导致所有分面共用同一组标签,无法区分场次。

解决方案

通过为每个场次的type生成专属的X轴水平,并结合scale="free_x"让分面只显示本场次的X轴内容,实现标签与场次的正确匹配。

步骤1:预处理数据,生成专属X轴水平与标签映射

# 为每行生成场次+类型的专属X轴水平
fr <- fr %>%
  mutate(x_level = paste(game, type, sep = "_"))

# 建立X轴水平到对应标签的映射
x_label_map <- fr %>%
  distinct(x_level, labels) %>%
  tibble::deframe()

步骤2:修改绘图代码,适配专属X轴水平

f <- ggplot(fr, aes(x = x_level, y = prob, fill = type, group = type))
f <- f + geom_col() +
  geom_text(
    aes(
      label = ifelse(prob > 0, paste0(" ", scales::percent(prob, accuracy = 0.01)), ""),
      color = type
    ),
    fontface = "bold", family = "Oswald", size = 4, vjust = -1
  ) +
  scale_y_continuous(
    labels = scales::percent_format(accuracy = 1),
    expand = expansion(add = c(0, 0.25))
  ) +
  scale_x_discrete(name = NULL, labels = x_label_map) +
  theme(
    axis.text.x = ggtext::element_markdown() # 支持渲染图片标签
  ) +
  facet_wrap(
    ~game, 
    scale = "free_x", # 每个分面只显示本场次的X轴水平
    axes = "all_x", 
    as.table = TRUE, 
    ncol = 1
  ) +
  labs(subtitle = "Estimations après simulation de Monte Carlo sur un paramètre interne") +
  transition_states(frame2, wrap = FALSE) +
  shadow_mark(past = TRUE) +
  enter_fly(y_loc = 0)
f

效果说明

  • 每个分面的X轴会仅显示对应场次的三个水平(主队/Nul/客队)
  • 每个水平的标签会匹配本场次的球队Logo或「Nul」文本
  • scale="free_x"确保不同分面的X轴不会显示其他场次的水平,避免混乱

内容的提问来源于stack exchange,提问作者M.O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:24:49