You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:17:36