ggplot2中因子层级顺序异常、多余竖线及右侧X轴自定义问题
ggplot2中因子层级顺序异常、多余竖线及右侧X轴自定义问题
我来帮你解决这三个问题,先看修正后的完整代码,再逐个解释原因和解决思路:
library(dplyr) library(ggplot2) library(tidyr) # 加载并整理数据集 desfactorial <- read.table(text="Solvent Water_added PRY CRY PCR 1 Water 0 5.147654 11.56463 0.4451206 2 Water 0 5.242064 11.96381 0.4381602 3 Water 3 5.388539 12.21016 0.4413159 4 Water 3 5.542092 12.12285 0.4571607 5 Water 6 5.596923 12.15505 0.4604608 6 Water 6 5.337580 11.81707 0.4516839 7 Water 20 6.356056 12.12505 0.5242085 8 Water 20 6.113984 12.47696 0.4900217 9 ChCl:2Gly 0 5.627548 10.40986 0.5405979 10 ChCl:2Gly 0 5.558506 10.05448 0.5528388 11 ChCl:2Gly 3 6.568054 11.31326 0.5805625 12 ChCl:2Gly 3 6.713675 11.97304 0.5607327 13 ChCl:2Gly 6 6.825598 12.11337 0.5634763 14 ChCl:2Gly 6 7.041888 11.61301 0.6063791 15 ChCl:2Gly 20 7.903524 12.64268 0.6251462 16 ChCl:2Gly 20 8.249468 12.13060 0.6800542 17 ChCl:2Urea 0 7.221118 11.65261 0.6196993 18 ChCl:2Urea 0 6.841036 10.71166 0.6386534 19 ChCl:2Urea 3 6.988471 11.77654 0.5934233 20 ChCl:2Urea 3 7.292778 11.88234 0.6137494 21 ChCl:2Urea 6 8.809266 12.42277 0.7091226 22 ChCl:2Urea 6 8.927845 12.00003 0.7439853 23 ChCl:2Urea 20 10.011425 13.70436 0.7305283 24 ChCl:2Urea 20 9.407607 12.48654 0.7534196 25 ChCl:2Urea 45 8.323769 12.89661 0.6454228 26 ChCl:2Urea 45 8.520286 13.17925 0.6464923 27 Water 10 6.163627 12.38129 0.4978178 28 Water 10 6.226446 12.72711 0.4892268 29 Water 30 6.500778 11.83811 0.5491398 30 Water 30 6.347181 11.95258 0.5310303 31 Water 45 5.796056 12.29078 0.4715776 32 Water 45 6.262255 12.25520 0.5109877 33 ChCl:2Gly 10 6.936715 11.76254 0.5897291 34 ChCl:2Gly 10 7.871232 13.16848 0.5977327 35 ChCl:2Gly 30 7.516940 12.43334 0.6045792 36 ChCl:2Gly 30 8.069310 12.97053 0.6221263 37 ChCl:2Gly 45 8.423233 13.11659 0.6421818 38 ChCl:2Gly 45 8.229903 12.98646 0.6337295 39 ChCl:2Urea 10 8.954759 12.44479 0.7195587 40 ChCl:2Urea 10 8.353048 13.21604 0.6320385 41 ChCl:2Urea 30 8.243016 12.90292 0.6388490 42 ChCl:2Urea 30 8.281513 13.20763 0.6270248", header=TRUE) desfactorial %>% mutate(across(Solvent:Water_added, as.factor)) %>% # 单独处理Water_added的因子顺序:转数值排序后重新设置层级 mutate(Water_added = factor(Water_added, levels = sort(as.numeric(levels(Water_added))))) %>% pivot_longer(Solvent:Water_added) %>% # 单独调整Solvent的显示顺序,避免和Water_added的层级混淆 mutate(value = if_else(name == "Solvent", factor(value, levels = c("Water", "ChCl:2Gly", "ChCl:2Urea")), value)) %>% ggplot(aes(value, PCR, group = name, color = name)) + geom_point(stat = 'summary', fun = mean) + geom_errorbar(stat = 'summary', width = 0.1, alpha = 0.5) + geom_line(stat = 'summary', fun = mean) + geom_text(stat = 'summary', fun = mean, color = 'black', aes(label = after_stat(round(y, 2))), position = position_nudge(0.4, 0.01)) + facet_grid(~name, scales = 'free_x', switch = 'x') + scale_color_brewer(palette = 'Set1', guide = 'none') + coord_cartesian(clip = 'off') + # 移除多余的手动添加竖线 theme_minimal(base_size = 20) + theme(strip.placement = 'outside', strip.background = element_blank(), axis.title.x = element_blank(), panel.grid.major.x = element_blank(), panel.spacing.x = unit(0, 'mm'), axis.ticks = element_line(), axis.line.x = element_line(), # 自定义右侧Water_added的X轴样式:通过面板判断单独设置 axis.text.x = element_text( color = ifelse(ggplot2::after_scale(ggplot2::get_panel()$layout$name == "Water_added"), "darkred", "black"), size = ifelse(ggplot2::after_scale(ggplot2::get_panel()$layout$name == "Water_added"), 22, 20) ))
逐个问题解决说明
Water_added层级顺序异常:
你之前在mutate(value = factor(...))里手动把所有因子的层级混在一起设置,打乱了Water_added的数值顺序。现在我们单独处理:先把Water_added的层级转成数值排序,再重新设置因子层级,这样就能保证它按0、3、6、10、20、30、45的递增顺序显示。Solvent的顺序也单独调整,避免互相干扰。多余竖线:
那条竖线是你代码里手动添加的geom_vline(...),直接删掉这一行就能移除它了。自定义右侧X轴:
利用ggplot2的after_scale和get_panel()功能,我们可以判断当前面板是否是Water_added,然后单独设置它的X轴文字样式(比如颜色、字号)。你可以根据自己的需求修改这里的样式参数,比如添加倾斜角度、改变字体等。
备注:内容来源于stack exchange,提问作者David Moldes
相关产品推荐
相关产品推荐

