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.

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.


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


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)))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.