Отображение нескольких факторов с графиками Сина - PullRequest
0 голосов
/ 18 мая 2018

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

Исходный вопрос

Давайте предположим, что Iиметь двухфакторный дизайн с 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()

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

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 были бы отличным способом отобразить наши данные.Может кто-нибудь придумать обходной путь для графиков Сины, чтобы я все еще мог отображать два фактора, как в примере с графиками скрипки выше?

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

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

    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))

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

    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 Ответ

0 голосов
/ 18 мая 2018

Отредактированное решение , поскольку 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), которая будетсопоставлены с осью X.

Остальная часть кода в scale_x_discrete() & theme() предназначена для скрытия меток / галочек / линий сетки по умолчанию для оси X.

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

edited solution

Исходное решение :

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

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

plot

...