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

Reactormonk
источник

Ответы:

32

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

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

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

Joran
источник
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
59

например:

 qplot(round, price, data=firm, group=id, color=id, geom='line') +  
      geom_smooth(aes(group=interaction(size, type)))
Давуд Тагави-Нежад
источник