згрупувати за двома стовпцями у ggplot2


90

Чи можна згрупувати за двома стовпцями? Отже, перехресний добуток намальовано 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Повинен побудувати свій ФР , а не навпаки.
ClementWalter

3
Я згоден, відповідь Блакитного магістра є кращою.
Джестон,

6
@clemlaflemme Я думаю, що відповідь BlueMagister є чудовою, хоча, на мою думку, розходження в цьому випадку досить незначне. Але загальна позиція, згідно з якою не слід модифікувати ваш фрейм даних для сюжету, є цікавою, зважаючи на ваш вибір використовувати ggplot2 , весь дизайн якого ґрунтується на явній структурі ваших даних для роботи з семантикою ggplot.
joran

Недоліком pasteє те, що коли вхід є фактором, він відкидає рівні, де interactionзберігає порядок вихідних факторів. Це означає, що групи більш природно упорядковані з interactionпідходом.
Кота Морі

172

Взявши приклад із цього питання , використовуючи 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.