如何调整ggplot2分面标签位置?将指定标签移至绘图左侧
实现分面标签分置左侧/顶部的方案
当然可以实现这个需求!你当前用的facet_wrap()会把所有分面标签都放在同一方向(默认顶部),要实现一个标签在左侧、一个在顶部,最简单的方式是换成facet_grid()——它专门用来控制行、列分面的独立布局,行标签默认显示在左侧,列标签默认显示在顶部,完美匹配你的需求。
下面是修改后的完整代码,我标注了关键调整点:
library(ggplot2) library(ggsci) library(ggthemes) library(ggh4x) df <- data.frame(x=c(0,0,0.3,0.8,1.5,3,5,7,9,13,15,20,28), y=c(0,0,0.3,0.8,1.5,3,5,7,9,13,15,20,28)) df$Method <- "Pearson" df$ID <- "A" Plot <- ggplot(df, aes(x=x, y=y)) + geom_point(size=.8) + theme_hc() + theme( strip.background = element_rect(colour = "black", fill = "white", size = 1.5, linetype = "solid"), axis.title.x =element_blank(), axis.title.y =element_blank(), axis.text.x = element_text(angle = 0, hjust = 0.5,size = 10.5, face="bold"), axis.text.y = element_text(angle = 0, hjust = 0.5,size = 10.5), strip.text.x = element_text(size = 9), # 调整左侧标签的显示角度,让文字横向居中(默认是垂直的,可选调整) strip.text.y = element_text(size = 13, angle = 0, hjust = 0.5), axis.line = element_line(), panel.grid.major= element_blank(), panel.grid.minor = element_blank(), legend.text=element_text(size=9), legend.title = element_text(size=10,face="bold"), legend.key=element_blank(), legend.justification = c(0.5,0), legend.position = "right", panel.border = element_blank(), strip.placement = "outside", plot.title = element_text(size = 16, hjust = 0.5), strip.switch.pad.grid = unit('0.1', "cm") ) + labs(x= '\nTime delay (modifiable device)',y=expression(R^{2})) + guides(color=guide_legend(override.aes=list(fill=NA))) + scale_y_continuous(limits = c(0., 30), breaks = c(5, 15,25)) + # 核心修改:用facet_grid指定行/列分面,ID作为行(左侧标签),Method作为列(顶部标签) facet_grid(ID ~ Method) + scale_color_jco() Plot
关键说明:
facet_grid(ID ~ Method):公式中~左侧的变量(ID)会作为行分面,标签自动显示在绘图左侧;右侧的变量(Method)作为列分面,标签显示在顶部。- 如果你觉得左侧标签默认的垂直文字看着别扭,我在
strip.text.y里加了angle = 0,让文字横向居中显示,和你原来的设置风格保持一致。
备选方案(用ggh4x的facet_wrap2):
如果你因为分面数量多等原因坚持想用facet_wrap,可以利用你已经加载的ggh4x包的facet_wrap2()功能,通过strip.position参数分别指定每个变量的标签位置:
facet_wrap2(Method~ID, strip.position = c("top", "left"))
不过对于你当前的单分面场景,facet_grid是更直观、更轻量化的选择。
内容的提问来源于stack exchange,提问作者Dekike




