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

调整ggplot2中facet_grid的ML标题位置并设置为粗体

问题与解决方案:ggplot2分面标签优化

数据框

ML Algorithm Option  Coeff  Lower  Upper
1  Random Forest    Algo_1  Opt_1  0.021 -0.124  0.166
2          Lasso    Algo_1  Opt_1  0.130 -0.012  0.273
3        XGBoost    Algo_1  Opt_1 -0.052 -0.211  0.108
4     Neural Net    Algo_1  Opt_1  0.114 -0.009  0.238
5  Random Forest    Algo_1  Opt_2  0.116 -0.033  0.264
6          Lasso    Algo_1  Opt_2  0.158  0.019  0.297
7        XGBoost    Algo_1  Opt_2 -0.260 -0.508 -0.012
8     Neural Net    Algo_1  Opt_2  0.035 -0.100  0.170
9  Random Forest    Algo_2  Opt_1  0.028 -0.117  0.172
10         Lasso    Algo_2  Opt_1  0.134 -0.008  0.277
11       XGBoost    Algo_2  Opt_1 -0.054 -0.214  0.106
12    Neural Net    Algo_2  Opt_1  0.118 -0.006  0.241
13 Random Forest    Algo_2  Opt_2  0.038 -0.097  0.172
14         Lasso    Algo_2  Opt_2  0.133 -0.006  0.272
15       XGBoost    Algo_2  Opt_2 -0.055 -0.240  0.131
16    Neural Net    Algo_2  Opt_2  0.118 -0.007  0.242

现有绘图代码

p <- ggplot(results2, aes(x = Option, y = Coeff, color = ML))+
  geom_point(size = 5)+ 
  facet_grid(.~ML+Algorithm,scales = "free_x")+
  geom_errorbar(aes(ymin = Lower, ymax = Upper, color = ML), size =1)+
  geom_hline(yintercept = 0, color = "grey", size = 1.5) +
  scale_x_discrete(guide = guide_axis(n.dodge = 2))+
  theme(panel.border = element_blank(),panel.spacing.x = unit(0,"line"))+ # Remove space between facets
  xlab("")+
  ylab("")
p

问题

  1. 如何将ML名称(如Lasso、Random Forest等)移至对应Algo_1和Algo_2之间的上方,使每个ML名称仅显示一次,而非在每个Algo上方重复显示?
  2. 如何将ML名称设置为粗体?

解决方案

可以通过ggtext自定义标签样式,结合gtable调整分面布局来实现需求,具体步骤如下:

1. 加载依赖包

library(ggplot2)
library(ggtext)
library(gtable)
library(grid)

2. 修改绘图代码并调整分面

# 基础绘图
p <- ggplot(results2, aes(x = Option, y = Coeff, color = ML))+
  geom_point(size = 5)+ 
  # 开启分面标签切换到x轴上方,保留原分面层级
  facet_grid(.~ML+Algorithm, scales = "free_x", switch = "x")+
  geom_errorbar(aes(ymin = Lower, ymax = Upper, color = ML), size =1)+
  geom_hline(yintercept = 0, color = "grey", size = 1.5) +
  scale_x_discrete(guide = guide_axis(n.dodge = 2))+
  theme(
    panel.border = element_blank(),
    panel.spacing.x = unit(0,"line"),
    # 使用ggtext设置ML标签为粗体
    strip.text.x.top = element_markdown(face = "bold"),
    # 隐藏分面背景,让标签层级更清晰
    strip.background.x = element_blank(),
    # 调整标签位置到外部,方便合并布局
    strip.placement = "outside"
  )+
  xlab("")+
  ylab("")

# 用gtable合并同一ML对应的两个分面标签
gt <- ggplotGrob(p)
# 定位ML对应的分面条
ml_strips <- which(grepl("ML", gt$layout$name))
# 逐个合并同一ML的两个分面标签
for (i in seq(1, length(ml_strips), 2)) {
  # 扩展第一个标签的宽度,覆盖两个分面
  gt$layout$l[ml_strips[i]] <- min(gt$layout$l[ml_strips[i]], gt$layout$l[ml_strips[i+1]])
  gt$layout$r[ml_strips[i]] <- max(gt$layout$r[ml_strips[i]], gt$layout$r[ml_strips[i+1]])
  # 删除重复的标签
  gt$grobs[ml_strips[i+1]] <- NULL
  gt$layout <- gt$layout[-ml_strips[i+1], ]
}

# 绘制调整后的图形
grid.draw(gt)

效果说明

  • ML名称会居中显示在对应Algo_1和Algo_2分面的上方,每个ML仅显示一次
  • ML名称通过element_markdown设置为粗体,样式更突出

内容的提问来源于stack exchange,提问作者miamialan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:31:04