移除多因子R绘图(ggplot2)中的内部竖线问题
问题描述
使用ggplot2绘制4个三水平分类因子与响应变量的关系图时,设置panel.background = element_rect(color="black")会让每个因子面板生成独立边框,出现多余的内部竖线;但移除这行代码后,绘图的右侧和顶部边框缺失,需要找到两全的解决办法。
解决方案
核心思路是用panel.border替代panel.background设置边框,同时保持面板间距为0,让内部边框重叠消失,且不会缺失顶部和右侧边框。修改后的完整代码如下:
library(ggplot2) library(scales) library(ggpubr) library(car) library(tidyverse) # 数据准备 scenedesmus <- structure(list(Temperature = c(20, 20, 20, 20, 20, 20, 30, 30, 30, 30, 30, 30, 40, 40, 40, 40, 40, 40), Time = c(0.5, 0.5, 1, 1, 2, 2, 0.5, 0.5, 1, 1, 2, 2, 0.5, 0.5, 1, 1, 2, 2), Ratio = c(3, 3, 6, 6, 12, 12, 6, 6, 12, 12, 3, 3, 12, 12, 3, 3, 6, 6), Milling = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 1L, 1L), levels = c("None", "Mortar", "Discs"), class = "factor"), PRY = c(7.10618979550317, 6.99107348052751, 9.81654489395678, 10.0937678454159, 15.8872899104855, 16.5147395153748, 15.6085073784574, 15.8904572330355, 9.85155639002801, 10.3291566375677, 9.81557388225615, 10.1774212169006, 12.0972576247432, 11.1350551614397, 14.7591913822601, 14.8846506719242, 9.47697977090569, 10.8328555963545), CRY = c(12.9913707456184, 13.2037056981015, 14.6223886369729, 14.4156689100426, 20.8510599220091, 21.1334682925674, 20.7517385553227, 20.3784601114164, 13.1903022986714, 12.7481614338955, 14.3799945987187, 15.1548695641213, 16.3653561008515, 17.3492383422838, 22.4414097199122, 22.4340213280367, 14.0895227253865, 16.0388931794408), PCR = c(0.546993072143667, 0.529478135939726, 0.671336615218633, 0.700194205929921, 0.761941597689038, 0.781449560798454, 0.752154203217537, 0.779767320305684, 0.746878742196859, 0.810246770966047, 0.682585366418063, 0.671561122571146, 0.739199168670324, 0.641818098394623, 0.657676659642481, 0.663485625438106, 0.672626032522028, 0.675411668071984)), row.names = c(NA, -18L), class = c("tbl_df", "tbl", "data.frame")) scenedesmus$Milling <- as.character(scenedesmus$Milling) scenedesmus$Temperature <- factor(scenedesmus$Temperature) scenedesmus$Time <- factor(scenedesmus$Time) scenedesmus$Ratio <- factor(scenedesmus$Ratio) # 绘图代码 scenedesmus %>% mutate(across(Temperature:Milling, as.character)) %>% pivot_longer(Temperature:Milling) %>% mutate(value = factor(value, levels(factor(value))[ c(12:10, 6, 9, 3, 5, 7:8, 1:2, 4)])) %>% ggplot(aes(value, PCR, group = name, color = name)) + geom_point(stat = 'summary', fun = mean, size=3) + geom_hline(yintercept = mean(scenedesmus$PCR, na.rm=TRUE),linetype='dotted', col = 'grey', size=1.5)+ scale_y_continuous(limits = c(0.5, 0.9)) + geom_line(stat = 'summary', fun = mean, size=1) + facet_grid(~name, scales = 'free_x', switch = 'x') + scale_color_manual(values = c("#0072B2", "#D55E00", "#CC79A7","#009E73")) + coord_cartesian(clip = 'off') + geom_vline(data = data.frame(a = 0.4, name = 'Milling'), aes(xintercept = a)) + theme_classic(base_size = 20) + theme(strip.placement = 'outside', legend.position="none", strip.background = element_blank(), axis.title.x = element_blank(), panel.grid.major=element_blank(), panel.grid.minor=element_blank(), # 关键修改:用panel.border替代panel.background,fill设为NA避免覆盖背景 panel.border = element_rect(color = "black", fill = NA), panel.spacing.x = unit(0, 'mm'), axis.ticks = element_line(), axis.line.x = element_line(), axis.title.y = element_text(size=20, face="bold"), strip.text = element_text(face = "bold")) + labs(y = "response")
关键改动说明
- 移除
panel.background = element_rect(color="black"),避免每个面板生成独立边框导致内部竖线 - 添加
panel.border = element_rect(color = "black", fill = NA):为每个面板添加边框,fill=NA保证不覆盖绘图背景 - 保留
panel.spacing.x = unit(0, 'mm'):让相邻面板的边框完全重叠,消除内部竖线的视觉效果 - 最终既保留了绘图的完整边框(包括顶部和右侧),又解决了内部多余竖线的问题
内容的提问来源于stack exchange,提问作者David Moldes
相关产品推荐
相关产品推荐

