Отображение нескольких факторов с графиками Сина

ПРИМЕЧАНИЕ: я обновил этот пост после обсуждения с З. Линем. Первоначально я упростил свою задачу до двухфакторного дизайна (см. Раздел "Оригинальный вопрос"). Однако мои фактические данные состоят из четырех факторов, требующих facet_grid. Поэтому ниже я приведу пример четырехфакторной схемы (см. Раздел "Редактирование").

Оригинальный вопрос

Давайте предположим, что у меня есть двухфакторный дизайн с dv в качестве моей зависимой переменной и iv.x и iv.y в качестве моих факторов / независимых переменных. Некоторые быстрые образцы данных:

DF <- data.frame(dv = rnorm(900), 
                 iv.x = sort(rep(letters[1:3], 300)), 
                 iv.y = rep(sort(rep(rev(letters)[1:3], 100)), 3))

Моя цель состоит в том, чтобы отобразить каждое условие отдельно, как это можно сделать на графиках скрипки:

ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_violin()  

Я недавно сталкивался с заговорами Сины и хотел бы сделать то же самое здесь. К сожалению, сюжеты Sina не делают этого, вместо этого сворачивая данные.

ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina()

Явный вызов позиции dodge тоже не помогает, так как при этом появляется сообщение об ошибке:

ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina(position = position_dodge(width = 0.5))

Авторы сюжетов Sina уже были ознакомлены с этой проблемой в 2016 году: https://github.com/thomasp85/ggforce/issues/47

Моя проблема больше с точки зрения времени. Вскоре мы хотим представить рукопись, и сюжеты Sina были бы отличным способом отобразить наши данные. Может кто-нибудь придумать обходной путь для сюжетов Sina, так что я все еще могу отобразить два фактора, как в примере с графиками скрипки выше?

редактировать

Пример данных для четырехфакторного дизайна:

    DF <- data.frame(dv=rnorm(400), 
             iv.w=sort(rep(letters[1:2],200)),
             iv.x=rep(sort(rep(letters[3:4],100)), 2),
             iv.y=rep(sort(rep(rev(letters)[1:2],50)),4),
             iv.z=rep(sort(rep(letters[5:6],25)),8))

Пример с участками скрипки того, что я хотел бы создать, используя участки Сины:

    ggplot(DF, aes(iv.x, dv, colour=iv.y)) + 
      facet_grid(iv.w ~ iv.z) +
      geom_violin(aes(y = dv, fill = iv.y), 
          position = position_dodge(width = 1))+
      stat_summary(aes(y = dv, fill = iv.y), fun.y=mean, geom="point", 
          colour="black", show.legend = FALSE, size=.2, 
          position=position_dodge(width=1))+
      stat_summary(aes(y = dv, fill = iv.y), fun.data=mean_cl_normal, geom="errorbar", 
          position=position_dodge(width=1), width=.2, show.legend = FALSE,
          colour="black", size=.2) 

1 ответ

Отредактированное решение, поскольку OP уточнил, что фасеты необходимы:

ggplot(DF, aes(x = interaction(iv.y, iv.x), 
               y = dv, fill = iv.y, colour = iv.y)) + 
  facet_grid(iv.w ~ iv.z) +      
  geom_sina() +
  stat_summary(fun.y=mean, geom="point", 
               colour="black", show.legend = FALSE, size=.2, 
               position=position_dodge(width=1))+
  stat_summary(fun.data=mean_cl_normal, geom="errorbar", 
               position=position_dodge(width=1), width=.2, 
               show.legend = FALSE,
               colour="black", size=.2) +
  scale_x_discrete(name = "iv.x", 
                   labels = c("c", "", "d", "")) +
  theme(panel.grid.major.x = element_blank(),
        axis.text.x = element_text(hjust = -4),
        axis.ticks.x = element_blank())

Вместо использования фасетов для имитации уклонения между цветами, этот подход создает новую переменную interaction(colour.variable, x.variable) быть сопоставлены с осью х.

Остальная часть кода в scale_x_discrete() & theme() там, чтобы скрыть стандартные метки оси x / галочки / линии сетки.

axis.text.x = element_text(hjust = -4) это хак, который смещает метки оси X примерно в правильное положение. Это некрасиво, но, учитывая, что вариант использования предназначен для представления рукописи, я предполагаю, что размер графиков будет фиксированным, и вам просто нужно настроить его один раз.

отредактированное решение

Оригинальное решение:

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

ggplot(DF, aes(x = iv.y, y = dv, colour = iv.y)) +
  geom_sina() + 
  facet_grid(~iv.x, switch = "x") +
  labs(x = "iv.x") +
  theme(axis.text.x = element_blank(),      # hide iv.y labels
        axis.ticks.x = element_blank(),     # hide iv.y ticks
        strip.background = element_blank(), # make facet strip background transparent
        panel.spacing.x = unit(0, "mm"))    # remove horizontal space between facets

сюжет

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