Бок о бок geom_boxplot для высоких и низких значений нескольких переменных в R? - PullRequest
3 голосов
/ 23 января 2020

Я пытаюсь создать boxplot, который бы сравнивал ob против A и B в нескольких местах (т. Е. Start, Mid, End) для Значения Top и Low (в данном случае 10%). Я пытаюсь использовать функциональность gather, facet_wrap, grid.arrange, ggplot в R, но не могу собрать все воедино. вот мой код - я был бы признателен за помощь в продвижении вперед.

library(tidyverse)
library(gridExtra)

DF_1 = data.frame(Ob = runif(100, 10,80), A = runif(100, 5, 90), B = runif(100, 3,85), loc = rep("Start",100))
DF_2 = data.frame(Ob = runif(100, 10,80), A = runif(100, 5, 90), B = runif(100, 3,85), loc = rep("Mid",100))
DF_3 = data.frame(Ob = runif(100, 10,80), A = runif(100, 5, 90), B = runif(100, 3,85), loc = rep("End",100))

DF_1_Top = DF_1[order(DF_1$Ob,decreasing = TRUE),][1:10,]
DF_1_Low = DF_1[order(DF_1$Ob,decreasing = FALSE),][1:10,]

DF_2_Top = DF_2[order(DF_2$Ob,decreasing = TRUE),][1:10,]
DF_2_Low = DF_2[order(DF_2$Ob,decreasing = FALSE),][1:10,]

DF_3_Top = DF_1[order(DF_3$Ob,decreasing = TRUE),][1:10,]
DF_3_Low = DF_1[order(DF_3$Ob,decreasing = FALSE),][1:10,]

DF_Top = rbind(DF_1_Top, DF_2_Top, DF_3_Top)
DF_Low = rbind(DF_1_Low, DF_2_Low, DF_3_Low)

DF_T = gather(DF_Top, key = "Variable", value = "Value", - "loc")
DF_L = gather(DF_Low, key = "Variable", value = "Value", - "loc")

P1 = ggplot(DF_T, aes(x = Variable, y = Value))+
geom_boxplot()+facet_wrap(~loc, nrow = 1)

P2 = ggplot(DF_L, aes(x = Variable, y = Value))+
  geom_boxplot()+facet_wrap(~loc, nrow = 1)

grid.arrange(P1,P2, nrow = 2)

Вот нарисованная вручную фигура, которую я хотел бы получить enter image description here

1 Ответ

8 голосов
/ 23 января 2020

Вы можете сложить все свои данные в один фрейм данных и создать один график. Например:

d = bind_rows(High=DF_Top, Low=DF_Low, .id='source') %>% 
  mutate(source=factor(source, levels=c("High","Low")))

d %>% 
  gather(key, value, Ob:B) %>% 
  mutate(key = fct_relevel(key, "Ob")) %>% 
  ggplot(aes(key, value)) +
    geom_hline(yintercept=0) +
    geom_boxplot() +
    facet_grid(source ~ loc, switch="x") +
    labs(x="", y="") +
    scale_y_continuous(expand=expand_scale(mult=c(0.0, 0.02))) +
    theme_classic() +
    theme(strip.placement="outside", 
          strip.background.x=element_rect(colour=NA, fill=NA),
          strip.text.x=element_text(size=11, face="bold"))

enter image description here

Отвечая на ваш комментарий, я не в восторге от перемещения ярлыков key в легенду, но. ..

d %>% 
  gather(key, value, Ob:B) %>% 
  mutate(key = fct_relevel(key, "Ob")) %>% 
  ggplot(aes(loc, value, colour=key)) +
    geom_hline(yintercept=0) +
    geom_boxplot() +
    facet_grid(source ~ ., switch="x") +
    labs(x="", y="", colour="") +
    scale_y_continuous(expand=expand_scale(mult=c(0.0, 0.02))) +
    theme_classic() +
    theme(legend.position="bottom",
          legend.box.margin=margin(t=-20))

enter image description here

...