группировать по двум столбцам в ggplot2


91

Можно ли сгруппировать по двум столбцам? Итак, перекрестное произведение нарисовано geom_point()и geom_smooth()?

Например:

frame <- data.frame(
 series <- rep(c('a', 'b'), 6), 
 sample <- rep(c('glass','water', 'metal'), 4), 
 data <- c(1:12))

ggplot(frame, aes()) # ...

Такие, что точки 6и 12делятся группой, а не с 3.

Ответы:


32

Почему бы просто не использовать pasteэти два столбца вместе и использовать эту переменную как группы?

frame$grp <- paste(frame[,1],frame[,2])

Несколько более формальный способ сделать это - использовать функцию interaction.


27
Я думаю, вам не стоит переделывать свой data.frameдля сюжета. Он plotдолжен отображать ваш df, а не наоборот.
— ClementWalter

3
Я согласен, ответ Blue Magister лучше.
— Джестон

6
@clemlaflemme Я думаю, что ответ BlueMagister в порядке, хотя я думаю, что различие в этом случае довольно незначительное. Но общая позиция, согласно которой не следует изменять фрейм данных для построения графика, является любопытной, учитывая ваш выбор использовать ggplot2 , весь дизайн которого основан на явном структурировании ваших данных для работы с семантикой ggplot.
— Joran

Недостатком pasteявляется то, что когда вход является фактором, он отбрасывает уровни, где interactionсохраняет порядок исходных факторов. Это означает, что группы более естественно упорядочиваются по мере interactionприближения.
— Кота Мори

174

Взяв пример из этого вопроса , используя interactionдля объединения двух столбцов в новый коэффициент:

# Data frame with two continuous variables and two factors 
set.seed(0)
x <- rep(1:10, 4)
y <- c(rep(1:10, 2)+rnorm(20)/5, rep(6:15, 2) + rnorm(20)/5)
treatment <- gl(2, 20, 40, labels=letters[1:2])
replicate <- gl(2, 10, 40)
d <- data.frame(x=x, y=y, treatment=treatment, replicate=replicate)

ggplot(d, aes(x=x, y=y, colour=treatment, shape = replicate,
  group=interaction(treatment, replicate))) + 
  geom_point() + geom_line()

пример ggplot


Это работает для меня:ggplot(df) + geom_violin(aes(class1, metric.var, group = interaction(class1, class2)), position = position_dodge(width=.5))
— ivan866

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.