使用scale_y_cut后plot.margin设置失效问题求助
解决scale_y_cut干扰plot.margin生效的问题
问题原因
scale_y_cut会将原始ggplot图形分割为多个子面板并重新拼接成新图形,普通theme()中的plot.margin仅作用于单个子面板,无法影响拼接后的整体图形边距。
解决方案
方法一:使用theme_break()设置整体边距
ggbreak包提供了theme_break()函数,专门用于处理断裂图形的主题设置,它能将plot.margin应用到拼接后的整体图形上:
set.seed(5) library(tidyverse) library(ggbreak) data <- data.frame( id = c(1:100), age = sample(20:80, 100, replace = TRUE), sex = sample(c("M", "F"), 100, replace = TRUE, prob = c(0.7, 0.3)), type = sample(letters[1:5], 100, replace = TRUE), name = sample(c("longnamelongnamelongname1", "longnamelongname2longname", "longnamelongnamelongname3", "longnamelongnamelongname4"), 100, replace = TRUE, prob = c(0.25, 0.25, 0.25, 0.25)), direction = sample(c("Up", "Down"), 100, replace = TRUE, prob = c(0.7, 0.3)), bmi = sample(15:35, 100, replace = TRUE), sbp = sample(75:160, 100, replace = TRUE) ) ggplot(data, aes(name, age, color=sex, fill=sex, size=sex, shape = type)) + geom_point() + theme_bw() + scale_y_cut(breaks=(c(40)), scale=0.15) + # 用theme_break替代theme,统一设置主题与整体边距 theme_break(plot.margin = unit(c(0.5, 0.5, 0.5, 3), "cm"), panel.grid.minor = element_blank(), axis.text.x = element_markdown(angle = 45, vjust = 1, hjust = 1, size = 10.5), legend.title = element_text(size=12), legend.text = element_text(size=11), legend.key.size = unit(.8, "cm"), legend.key.height = unit(.5, "cm"))
方法二:手动调整拼接后的图形对象
如果方法一效果不佳,可以将图形转为gtable对象,直接修改整体边距:
set.seed(5) library(tidyverse) library(ggbreak) library(grid) data <- data.frame( id = c(1:100), age = sample(20:80, 100, replace = TRUE), sex = sample(c("M", "F"), 100, replace = TRUE, prob = c(0.7, 0.3)), type = sample(letters[1:5], 100, replace = TRUE), name = sample(c("longnamelongnamelongname1", "longnamelongname2longname", "longnamelongnamelongname3", "longnamelongnamelongname4"), 100, replace = TRUE, prob = c(0.25, 0.25, 0.25, 0.25)), direction = sample(c("Up", "Down"), 100, replace = TRUE, prob = c(0.7, 0.3)), bmi = sample(15:35, 100, replace = TRUE), sbp = sample(75:160, 100, replace = TRUE) ) # 先绘制基础图形 p <- ggplot(data, aes(name, age, color=sex, fill=sex, size=sex, shape = type)) + geom_point() + theme_bw() + scale_y_cut(breaks=(c(40)), scale=0.15) + theme(panel.grid.minor = element_blank(), axis.text.x = element_markdown(angle = 45, vjust = 1, hjust = 1, size = 10.5), legend.title = element_text(size=12), legend.text = element_text(size=11), legend.key.size = unit(.8, "cm"), legend.key.height = unit(.5, "cm")) # 转为gtable并调整整体边距 gt <- ggplotGrob(p) gt$margins <- unit(c(0.5, 0.5, 0.5, 3), "cm") grid.draw(gt)
内容的提问来源于stack exchange,提问作者celilati
相关产品推荐
相关产品推荐

