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