2016-05-04 2 views
3

Mein Diagramm besteht derzeit aus mehreren X-Achsen-Elementen, die jeweils 2 Y-Achsenwerte erhalten (eins pro Gruppe, bedeutet stat_summary). Das Diagramm wird jedoch aus Gründen der mittleren Funktion von stat_summary umgedreht (aber das ist nicht der Punkt hier).Verbinden Sie Punkte innerhalb eines Elements, aber über Gruppen hinweg mit Pfeilen

df <- data.frame(
    value = c(0, 0, -2, 1, 2, -2, 3, 1, 2, 3, 2, -1), 
    type = c('P', 'P', 'E', 'P', 'E', 'E', 'P', 'E', 'E', 'E', 'P', 'P'), 
    item = c('well-written', 'concise', 'well-written', 'clear', 'concise', 'clear', 'lively', 'fair', 'lively', 'pleasing', 'pleasing', 'fair') 
) 

ggplot(df, aes(x=item, y=value, colour=type)) + 
    stat_summary(fun.y=mean, geom='point', size=3) + 
    scale_y_continuous(limits=c(-3, 3), breaks=c(-3, -2, -1, 1, 2, 3), minor_breaks=c(0)) + 
    scale_linetype_discrete() + 
    coord_flip() 

Meine aktuelle Handlung, ohne Pfeile (Status quo): enter image description here

Was ich will, ist, für jeden einzelnen Artikel ("gut geschrieben", "kurze", ...) um einen Pfeil von E (der rote Punkt) auf P (den blauen Punkt) zu zeichnen. Daher möchte ich mehrere horizontale Pfeile, einen für jeden Gegenstand.

Wie?

Nur eine kleine Ergänzung hier: Ich weiß, dass ich nicht die mittlere Funktion in diesem Beispiel benötigen würde, aber meine tatsächlichen Daten sind viel größer und enthält mehrere P/gut geschrieben, E/prägnant usw. Werte, so dass der Mittelwert Funktion macht Sinn

+0

Nur ein kleiner Zusatz hier: Ich weiß, dass ich die mittlere Funktion in diesem Beispiel nicht brauchen würde, aber meine eigentlichen Daten sind viel größer und enthalten mehr P/gut geschrieben, E/prägnant, usw. Werte, so dass die mittlere Funktion macht Sinn :) – Mario

Antwort

1

hier ein Ansatz ist, das jedoch einen zweiten Datenrahmen erfordert erst geschaffen werden:

library(tidyr) 
df2 <- df %>% spread(type, value) 

Dann sind Sie geom_segment wie so hinzufügen:

ggplot(df, aes(x=item, y=value, colour=type)) + 
    stat_summary(fun.y=mean, geom='point', size=3) + 
    scale_y_continuous(limits=c(-3, 3), breaks=c(-3, -2, -1, 1, 2, 3), minor_breaks=c(0)) + 
    scale_linetype_discrete() + 
    coord_flip() + 
    geom_segment(data = df2, aes(x = item, xend = item, y = E, yend = P, group = item), 
       colour = "black", 
       arrow = arrow()) 

enter image description here

+1

Großartig, danke. Ein anderer Ansatz, den ich gerade gefunden habe, besteht darin, zuerst die mittlere Berechnung in einen separaten Datenrahmen zu bringen und dann, zweitens, die Punkte mit geom_point anzuzeigen. Auf diese Weise können 'geom_line (arrow = arrow())' und 'group = item' (innerhalb von ggplot-aes, siehe http://stackoverflow.com/a/11405077/2332153) hinzugefügt werden. – Mario

Verwandte Themen