Добавьте галочки между дискретными группами по оси X

Я хочу заменить один из моих сгруппированных коробочных графиков (ниже) на вид "до", но сгруппировать его. Этот был сделан с использованием ggboxplot() от ggpubr, Я знаю, что есть также ggpaired() но мне не удалось сделать это сгруппированным, как этот.

сгруппированный бокс

Благодаря этому вопросу я смог создать сгруппированный график до-после, как этот. Теперь я хотел бы изменить ось с 4 меток на 2 (просто "да" и "нет", поскольку "до" и "после" все еще в легенде. сгруппированные точечные участки с линиями между ними

Вот мой код с фиктивными данными:

library(tidyverse)

set.seed(123)
data.frame(ID = rep(LETTERS[1:10], 2),
           consent = rep(sample(c("Yes", "No"), 10, replace = T), 2),
           height = sample(rnorm(20, 170, sd = 10)),
           ind = rep(c("before", "after"), each = 2)
           ) %>%
  ggplot(aes(x = interaction(ind, consent), y = height, color = ind))+
  geom_point()+
  geom_line(aes(group = interaction(ID, consent)), color = "black")+
  scale_x_discrete("response")

Можно ли даже уменьшить количество категорий на оси? Или я могу создать сгруппированный график, используя ggpaired(), но без использования граней?

2 ответа

Решение

Решение может состоять в том, чтобы создать фиктивную числовую переменную (до и после) и поместить ее на ось X. Тогда вы можете изменить его имена.

# Generate OP data
library(tidyverse)
set.seed(123)
df <- data.frame(ID = rep(LETTERS[1:10], 2),
           consent = rep(sample(c("Yes", "No"), 10, replace = T), 2),
           height = sample(rnorm(20, 170, sd = 10)),
           ind = rep(c("before", "after"), each = 2)
           )
df$name <- paste(df$consent, df$ind)

# Generate dummy numeric variable for `name` combinations 
foo <- data.frame(name = c("Yes before", "Yes", "Yes after", 
                           "No before", "No", "No after"),
                  X = 1:6)
#         name X
# 1 Yes before 1
# 2        Yes 2
# 3  Yes after 3
# 4  No before 4
# 5         No 5
# 6   No after 6

И теперь нам просто нужно на карту name в X и поместите его на оси X:

df <- merge(foo, df)
ggplot(df, aes(X, height))+
    geom_point(aes(color = ind)) +
    geom_line(aes(group = interaction(ID, consent))) +
    scale_x_continuous(breaks = c(2, 5), labels = foo$name[c(2, 5)])

@camille заставил меня задуматься о безрассудном решении. По-видимому, можно размещать метки фасетов не только в нижней части графика, но даже под осью. Который решил мою проблему без изменения моего фрейма данных:

library(ggpubr) #for theme_pubr and JCO palette

ggplot(df, aes(x = ind, y = height, group = ID))+
geom_point(aes(color = ind), size = 3)+
geom_line()+
labs(y = "Height")+
facet_wrap(~ consent, 
           strip.position = "bottom", ncol = 5)+   #put facet label to the bottom 
theme_pubr()+
color_palette("jco")+
theme(strip.placement = "outside",   #move the facet label under axis
      strip.text = element_text(size = 12),
      strip.background = element_blank(),
      axis.title.x = element_blank(),
      legend.position = "none")

Результат с датафреймом из вопроса:

Результирующее изображение

Другие вопросы по тегам