2016-10-15 3 views
1

Ich zeichne ein Liniendiagramm in ggplot. Jede Zeile entspricht einer Person und deren Entwicklung im Laufe der Zeit. Ich möchte eine Violine hinzufügen bei x = 11ggplot: Geige zu einem Liniendiagramm hinzufügen

enter image description here

die Gesamtverteilung der Werte auf dem y dargestellt zeigen: Ein vereinfachte, reproduzierbares Beispiel:

dat <- data.frame(x=rep(1:10, 10), y=rnorm(100), person=rep(LETTERS[1:10], each=10)) 
ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person)) 

Welche produziert -Achse.

Wenn ich einen + geom_violin() zum ggplot Aufruf hinzufüge, wird eine Geige bei jedem Wert von x gezeichnet (was Sinn macht). Aber was ich will ist, die Geige hinzuzufügen, die ich mit ggplot(dat, aes(x, y)) + geom_violin() bekommen würde.

Wie kombiniere ich diese beiden geom_ s in einem einzigen Diagramm, um einen vollständigen Überblick über meine Daten zu geben?


EDIT: Ich habe es mit geom_errorbar zu arbeiten, aber nicht mit einer Geige etwas ähnliches zu arbeiten:

ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person)) + 
    geom_errorbar(aes(x=11, ymax=mean(dat$y)+sd(dat$y), ymin=mean(dat$y)-sd(dat$y))) + 
    geom_point(aes(x=11, y=mean(dat$y)), size=4) 

Welche gibt mir diese:

enter image description here

Im Idealfall würde ich eine Violine anstelle der Fehlerbalken wünschen, um die Verteilung besser widerzuspiegeln.

Antwort

2

Sie müssen group = 1 verwenden innerhalb des aes von geom_violin:

ggplot(dat, aes(x, y)) + 
    geom_line(aes(color = person)) + 
    geom_violin(aes(group = 1), fill = NA, size = 1.5) + 
    theme_minimal() 

ergibt dies:

enter image description here

die Violine zu zeichnen neben dem Liniendiagramm Sie von grid.arrange machen aus dem gridExtra Paket:

p1 <- ggplot(dat, aes(x, y)) + 
    geom_line(aes(color = person)) + 
    theme_minimal(base_size = 14) 
p2 <- ggplot(dat, aes(x, y)) + 
    geom_violin(fill = NA) + 
    theme_minimal(base_size = 14) + 
    theme(axis.title = element_text(color = NA), 
     axis.text = element_text(color = NA)) 

library(gridExtra) 
grid.arrange(p1, p2, ncol=2, widths = c(4,1)) 

das gibt:

enter image description here

jedoch durch die Legende getrennt, die Linie und Violine Plots werden jetzt. Mit:

library(gtable) 
leg <- gtable_filter(ggplot_gtable(ggplot_build(p1)), "guide-box") 

grid.arrange(p1 + guides(color = FALSE), p2, leg, ncol=3, widths = c(4,1,1)) 

Sie die Legende auf der rechten Seite des Grundstücks wieder platzieren können:

enter image description here

+0

Und gibt es eine Möglichkeit, dass ich diese Geige bei x = 11 zeigen kann, anstatt den ganzen Graphen zu überspannen? Im Idealfall möchte ich, dass es zwischen den Zeilen und der Legende angezeigt wird. – Florian

+0

Siehe meine Bearbeitung im OP zur Klarstellung. – Florian

+0

@Florian das Update sehen – Jaap

1

ich es herausgefunden:

ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person)) + 
    geom_violin(aes(x=rep(11, nrow(dat)), y=y, group=1)) 

Dinge zu beachten: aes(x=11, y=y) Einstellung in geom_violin() funktioniert nicht, weil (a) x und y müssen die gleiche Länge haben und (b) würden Sie zehn Violinen bekommen.

(a) durch rep() ‚ing die Zahl um einen Vektor von gleicher Länge y und (b) vermieden wird erstellen group = 1 indem (wie durch Procrastinatus Maximus wies darauf hin,‘ vermieden werden Antwort).

Das resultierende Grundstück:

enter image description here

Wenn es eine bessere Lösung für dieses Problem, ich würde es gerne sehen!

+0

Dies wird nicht die richtige Violine Plot imo geben. Siehe auch meine aktualisierte Antwort – Jaap

+0

Was meinst du mit "nicht korrekt"? Die Geige könnte als vertikale Linie erscheinen, wenn die Werte auf der X-Achse größer sind, aber das kann mit 'geom_violin (..., width = X) 'eingestellt werden - aber die Geige * enthält * die Daten in' y '. Was ist daran nicht richtig? – Florian

+0

dies führt zu einer anderen Form der Violine – Jaap

Verwandte Themen