如何修改ggplot图表下方文本面板?含排序、间距等优化需求
解决ggplot下方文本面板的优化需求
需求说明
已实现ggplot图表下方添加文本面板的基础效果,需要完成以下优化:
- 将面板中的选项顺序调整为
Heat:>Needle:>Comb.: - 缩小三个处理选项间的垂直间距,以及Y轴相关的空白间距
- 统一面板内标题与内容的字体样式
优化后完整代码
library(patchwork) library(tidyverse) library(ggthemes) line_size <- 1.2 base_size <- 20 d <- tibble( Rodent= c(rep("Mouse",11), rep("Hamster",7), rep("Guinea pig",4), rep("Gerbil",12)), `Weight (gm)` = rnorm(34,25,10), `Heat:` = c(rep("+",11),rep("-",7),rep("+",4),rep("+",12)), `Needle:` = c(rep("+",11),rep("+",7),rep("+",4),rep("+",12)), `Comb.:` = c(rep("Phen",11),rep("-",7),rep("-",4),rep("Met",12)), ) p1 <- d %>% ggplot(aes(Rodent,`Weight (gm)`)) + geom_boxplot(lwd=1.3,colour="black")+ scale_y_continuous(expand = expansion(mult = c(0, 0.05)))+ labs(y = "Percentage") + theme_foundation(base_size = base_size, base_family = "sans")+ theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank(), text = element_text(colour = "black"), plot.title = element_text(face = "bold", size = rel(1), hjust = 0.5), axis.line = element_line(colour="black", size = line_size), axis.ticks = element_line(colour="black", size = line_size), axis.title = element_text(face = "bold", size = rel(1)), axis.title.y = element_text(angle = 90, vjust = 2), axis.title.x = element_blank(), axis.text = element_text(face = "bold", size = rel(1)), axis.text.x = element_blank(), plot.background = element_blank(), legend.title=element_blank(), legend.position = "none" ) # 调整选项顺序 d1 <- d %>% select(-`Weight (gm)`) %>% pivot_longer(-Rodent) %>% mutate(name = fct_relevel(name, "Heat:", "Needle:", "Comb.:")) p2 <- d1 %>% ggplot(aes(Rodent, name, label = value)) + # 统一字体样式:匹配主题的字体、加粗和大小 geom_text(size = rel(1)*base_size/10, family = "sans", face = "bold") + # 去掉Y轴上下的默认空白间距,缩小选项整体范围 scale_y_discrete(expand = expansion(mult = c(0, 0))) + labs(x = NULL, y = NULL)+ theme_foundation(base_size = base_size, base_family = "sans")+ theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank(), # 统一所有文本的加粗和字体 text = element_text(colour = "black", face = "bold"), # 缩小Y轴文本右侧边距,减少选项间的垂直间距(可调整r值) axis.text.y = element_text(margin = margin(r = -15)), axis.text.x = element_blank(), axis.ticks=element_blank(), plot.background = element_blank() ) p1 / p2
优化细节说明
调整选项顺序:
使用fct_relevel函数手动指定name列的顺序,确保文本面板的Y轴选项严格按照Heat:>Needle:>Comb.:排列。缩小间距:
- 处理选项间的垂直间距:通过
axis.text.y = element_text(margin = margin(r = -15))缩小Y轴文本的右侧边距,减少选项之间的空白; - 去掉Y轴默认扩展间距:添加
scale_y_discrete(expand = expansion(mult = c(0, 0)))移除Y轴上下的默认空白,让选项更紧凑。
- 处理选项间的垂直间距:通过
统一字体:
- 在
geom_text中设置family = "sans"、face = "bold",并通过rel(1)*base_size/10计算字体大小,确保和主题中的文本参数完全匹配; - 主题中
text元素统一设置face = "bold",确保所有文本(包括Y轴选项)的样式一致。
- 在
内容的提问来源于stack exchange,提问作者Celina
相关产品推荐
相关产品推荐

