группировать по двум столбцам в 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.