分组箱线图:geom_line 会产生不必要的垂直线并且可能有 3 组?

问题描述 投票:0回答:1

我想在 ggplot 中对箱线图进行分组,并同时绘制主题行(在每个条件组之间)。我找到了执行此操作的解决方案,但仅适用于两个分组,而且当我使用 geom_line 时,会添加不必要的垂直线。 背景:我正在显示 EEG 数据的不同预处理步骤(Opticat、Taper)的结果,以及所有这些针对两种实验条件(对比度)的结果。

我最初的计划是像这样绘制数据,然后在所有分组的对比(绿色和橙色箱线图)之间添加主题线:

ggplot(table, 
       aes(x = Contrast2, 
           y = Frequency)) +
  geom_boxplot(width = 0.5, aes(fill = factor(Contrast))) +
  facet_grid(~TaperType) +
  scale_fill_brewer(palette = "Set2") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, vjust = 1), axis.ticks.x = element_blank()) +
  geom_line(aes(group = as.numeric(Subject)), color = "grey") + 
  ggtitle("Peak frequency by contrast condition")

Figure 1

我按照here的说明添加行并相应地更改了我的代码。不幸的是,这是为两个分组设计的,所以我丢失了“Opticat”的附加分组。此外,geom_line 不仅应用于整个组,还应用于对比组本身(因此,出现奇怪的灰色垂直线)。

ggplot(table, 
       aes(x = Opticat, 
           y = Frequency,
           fill = Contrast)) +
  geom_boxplot(width = 0.5) +
  facet_grid(~TaperType) +
  scale_fill_brewer(palette = "Set2") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, vjust = 1), axis.ticks.x = element_blank()) +
  ggtitle("Peak frequency by contrast condition")

Figure 2

显然,这可能是因为我没有指定正确应用线条的组(参见此处),但我无法在网上找到特定于我的分组星座的解决方案。

任何人都可以帮助解决这些问题吗?或者最多两者兼而有之?

类似的数据可以这样生成:

OPTICAT = c(rep("Yes", 20), rep("No", 20))
Tapers = c(rep(c(rep("Singletaper", 10), rep("Multitaper", 10)),2))
Contr = c(rep(c(rep("low", 5), rep("high", 5)),4))
subject = c(rep(1:10, 4))

table <- data.frame(Subject = subject,
                    Opticat = OPTICAT,
                    TaperType = Tapers,
                    Contrast = Contr,
                    Frequency = runif(n = 40, min = 35, max = 70))

更新

我尝试为每个 geom_ 元素指定

aes()
,具体来说,但这不起作用:

ggplot(table) +
  geom_boxplot(width = 0.5, 
               aes(x = Opticat, 
                   y = Frequency,
                   fill = Contrast)) +  
  geom_line(color = "grey",
            aes(x = Contrast, 
                y = Frequency,
                group = as.numeric(Subject))) + 
  geom_point(position = position_jitterdodge(),
             size = 0.5,
             aes(x = Opticat, 
                 y = Frequency,
                 fill = Contrast,
                 group = Contrast)) +
  facet_grid(~TaperType) +
  scale_fill_brewer(palette = "Set2") +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5, vjust = 1), axis.ticks.x = element_blank()) +
  ggtitle("Peak frequency by contrast condition")

Figure 3

r ggplot2 grouping boxplot
1个回答
0
投票

我将其发布为答案,因为评论太长,但我仍在尝试找出最终目标。我认为您需要返回数据,因为您试图在 x 轴上排列不相等的因素。

# First combine your grouping variables
t3 <- table %>% 
    mutate(groups=stringr::str_c(Opticat,Contrast))
  
  ggplot(t3) +
    geom_boxplot(width = 0.5, 
                 aes(x = groups, 
                     y = Frequency,
                     fill = Contrast))  +
    facet_grid(~TaperType)  +
    
    geom_line(color = "grey",
              aes(x = groups, 
                  y = Frequency,
                  group = as.numeric(Subject)))  

从那里您可以将 x 轴标签更新得更漂亮。

© www.soinside.com 2019 - 2024. All rights reserved.