调整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
问题
- 如何将ML名称(如Lasso、Random Forest等)移至对应Algo_1和Algo_2之间的上方,使每个ML名称仅显示一次,而非在每个Algo上方重复显示?
- 如何将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
相关产品推荐
相关产品推荐

