R语言:grid.arrange多图统一轴标题+强制非科学计数法
解决方案
一、修复Y轴科学计数格式问题
你用label_comma()导致标签异常,是因为该函数会直接处理轴刻度的原始数值(即你设置的-4/-3等),而非你期望显示的0.0001这类转换后的值。可以用两种方式解决:
- 方式1:直接指定字符串格式的标签,避免ggplot自动转换
scale_y_continuous(breaks = c(-4,-3,-2,-1), labels = c("0.0001", "0.001", "0.01", "0.1"))
- 方式2:用
scales::number()强制禁用科学计数法生成标签
library(scales) scale_y_continuous(breaks = c(-4,-3,-2,-1), labels = number(c(0.0001,0.001,0.01,0.1), scientific = FALSE))
二、添加统一居中的全局轴标题
你之前误写的textGrub正确函数是grid::textGrob()。需要先隐藏两个子图的独立轴标题,再在组合图上添加全局标题:
- 子图中移除
labs()里的x/y轴标题,或者用theme()隐藏; - 用
grid.arrange()组合图后,通过grid::grid.text()添加全局标题并调整位置实现居中。
修改后的完整代码
library(ggplot2) library(gridExtra) library(grid) library(scales) library(fivethirtyeight) make_linear_regression <- function(){ # 第一个子图:隐藏自身轴标题 linear_scat_um <- filtered_data %>% ggplot(aes(x = log10(rel_wpm), y= log10(rel_um))) + geom_point(alpha = 0.2) + geom_smooth(method = lm, color = "red") + labs(title = "Voorkomens van 'eh'") + theme_fivethirtyeight() + theme(axis.title = element_text(), plot.title = element_text(colour = "#FF0000"), axis.line = element_line(colour = "black"), axis.title.x = element_blank(), axis.title.y = element_blank()) + scale_x_continuous(breaks = c(-2,-1,0,1,2), labels = c(0.01,0.1,1,10,100))+ scale_y_continuous(breaks = c(-4,-3,-2,-1), labels = number(c(0.0001,0.001,0.01,0.1), scientific = FALSE)) # 第二个子图:同样隐藏自身轴标题 linear_scat_uhm <- filtered_data %>% ggplot(aes(x=log10(rel_wpm), y=log10(rel_uhm))) + geom_point(alpha = 0.2) + geom_smooth(method = lm, color = "blue") + labs(title = "Voorkomens van 'ehm'") + theme_fivethirtyeight() + theme(axis.title = element_text(), plot.title = element_text(colour = "#0000FF"), axis.line = element_line(colour = "black"), axis.title.x = element_blank(), axis.title.y = element_blank()) + scale_x_continuous(breaks = c(-2,-1,0,1,2), labels = c(0.01,0.1,1,10,100)) + scale_y_continuous(breaks = c(-4,-3,-2,-1), labels = number(c(0.0001,0.001,0.01,0.1), scientific = FALSE)) # 组合两幅图 grid.arrange(linear_scat_um, linear_scat_uhm, ncol=2) # 添加全局轴标题 grid.text("Relatief Aantal Woorden Per Minuut", x=0.5, y=0.03, gp=gpar(fontsize=12)) grid.text("Hoeveel procent van spraak is 'eh'/'ehm'?", x=0.03, y=0.5, rot=90, gp=gpar(fontsize=12)) }
简化方案(用patchwork包)
如果觉得grid包调整位置麻烦,可改用patchwork包实现更简洁的全局标题控制:
library(patchwork) # 组合并添加全局标题 (linear_scat_um + linear_scat_uhm) + labs(x = "Relatief Aantal Woorden Per Minuut", y = "Hoeveel procent van spraak is 'eh'/'ehm'?") + theme(axis.title.x = element_text(hjust=0.5), axis.title.y = element_text(hjust=0.5))
内容的提问来源于stack exchange,提问作者Sikamixoticelixer
相关产品推荐
相关产品推荐

