gruppieren durch zwei Spalten in ggplot2

90

Ist es möglich, nach zwei Spalten zu gruppieren? Das Kreuzprodukt wird also von geom_point()und gezeichnet geom_smooth()?

Zum Beispiel:

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

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

So dass die Punkte 6und 12eine Gruppe teilen, aber nicht mit 3.

Reactormonk
quelle

Antworten:

32

Warum nicht einfach pastediese beiden Spalten zusammen und diese Variable als Gruppen verwenden?

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

Ein etwas formellerer Weg, dies zu tun, wäre die Verwendung der Funktion interaction.

Joran
quelle
27
Ich denke, Sie sollten Ihre nicht data.framezum Zweck einer Handlung ändern . Das plotsollte dein df zeichnen und nicht das Gegenteil.
ClementWalter
3
Ich stimme zu, die Antwort von Blue Magister ist besser.
Jeston
6
@clemlaflemme Ich denke, die Antwort von BlueMagister ist in Ordnung, obwohl ich denke, dass der Unterschied in diesem Fall ziemlich gering ist. Die allgemeine Position, dass Sie Ihren Datenrahmen für ein Diagramm nicht ändern sollten, ist jedoch merkwürdig, da Sie sich für die Verwendung von ggplot2 entschieden haben. Das gesamte Design basiert auf der expliziten Strukturierung Ihrer Daten, um mit der Semantik von ggplot zu arbeiten.
Joran
Ein Nachteil von pasteist, dass wenn Eingabe ein Faktor ist, die Ebenen verworfen werden, wobei interactiondie Reihenfolge der ursprünglichen Faktoren beibehalten wird. Dies bedeutet, dass die Gruppen mit interactionAnsatz natürlicher geordnet sind .
Kota Mori
168

Nehmen Sie das Beispiel aus dieser Frage und interactionkombinieren Sie zwei Spalten zu einem neuen Faktor:

# 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 Beispiel

Blauer Magister
quelle
Das funktioniert bei mir:ggplot(df) + geom_violin(aes(class1, metric.var, group = interaction(class1, class2)), position = position_dodge(width=.5))
ivan866
58

beispielsweise:

 qplot(round, price, data=firm, group=id, color=id, geom='line') +  
      geom_smooth(aes(group=interaction(size, type)))
Davoud Taghawi-Nejad
quelle