2016-06-29 4 views
5

Ich habe einen Datensatz mit Bewertungen für Fragen über zwei Jahre. Jede Frage hat einen Wert für 2015 und einen Wert für 2016. Ich möchte jedes Diagramm plotten und dann den Unterschied zwischen dem Wert von 2015 und dem Wert von 2016 zeigen. Ist die Punktzahl gestiegen oder gesunken oder gleich geblieben? Ich dachte, es könnte nützlich sein, Paare von Punkten mit einer Linie (oder einem Pfeil) zu verbinden, um die Richtung der Veränderung zu zeigen, aber es fällt mir schwer, dies zu tun. Hier ist mein Codebeispiel:ggplot2: Zeigen Sie den Unterschied in den Werten im Laufe der Zeit mit einem Pfeil

df <- read.table(text = "question y2015 y2016 
q1 90 50 
q2 80 60 
q3 70 90 
q4 90 60 
q5 30 20", header = TRUE) 

g1 <- ggplot(df, aes(x=question)) 
g1 <- g1 + geom_point(aes(y=y2015, color="y2015"), size=4) 
g1 <- g1 + geom_point(aes(y=y2016, color="y2016"), size=4) 
g1 

Verschiedene Ansätze zur Visualisierung sind willkommen.

+0

ich Zeit nicht haben jetzt eine Antwort zu schreiben, aber wenn Sie eine angemessene Anzahl von Fragen haben (Sie nennen ~ 100 in einem Kommentar unten) würde ich ein Streudiagramm von 2015 Partituren tun (x) vs 2016 Punkte (y). Addieren Sie in einer 45-Grad-Linie und Punkte über der Linie sind Verbesserungen, und die Korrelation zwischen den zwei Jahren ist deutlich sichtbar (und Ausreißer sollten auch hervorstechen). – Gregor

+0

@ selbst; Könnte für Sie interessant sein http://stackoverflow.com/questions/38109623/remove-legend-elements-of-one-specific-geom-show-legend-false-does-not-do-t/38110017#38110017 – Alex

Antwort

2

Es ist immer noch ein bisschen hässlich und Feinabstimmung benötigt, aber es bekam Pfeile;)

library(ggplot2) 
library(reshape2) 
library(dplyr) 

ggplot2df <- read.table(text = "question y2015 y2016 
q1 90 50 
       q2 80 60 
       q3 70 90 
       q4 90 60 
       q5 30 20", header = TRUE) 


df <- ggplot2df %>% 
    mutate(direction = ifelse(y2016 - y2015 > 0, "Up", "Down"))%>% 
    melt(id = c("question", "direction")) 


g1 <- ggplot(df, aes(x=question, y = value, color = variable, group = question)) + 
    geom_point(size=4) + 
    geom_path(aes(color = direction), arrow=arrow()) 

enter image description here

+0

Sehr cool. Das gefällt mir wirklich gut. – oneself

1

Vielleicht so etwas? Einige Umformungen der Daten werden benötigt und mit der Funktion gather aus der sehr nützlichen Bibliothek tidyr erledigt.

library(tidyr) 
library(ggplot2) 

g1 <- df %>% gather(year, value, y2015:y2016) %>% 
ggplot(aes(x = year, y = value, color= question)) + 
    geom_point() + 
    geom_line(aes(group=interaction(question))) 
g1 

enter image description here

+1

Dies ist ein sehr schönes viz. Es ist leicht, die eine Frage zu identifizieren, die zugenommen hat. – bouncyball

+2

Das ist nett. In den realen Daten habe ich jedoch viel mehr Fragen (~ 100) und sie Text für jeden ist länger als "q1". Also denke ich, dass es zu unübersichtlich wird, wenn man es so visualisiert. – oneself

3

Ich denke, eine "Hantel" Grafik auch funktionieren würde. Hier habe ich Ihre Daten zu lange umgestaltet.

df <- read.table(text = "question y2015 y2016 
q1 90 50 
q2 80 60 
q3 70 90 
q4 90 60 
q5 30 20", header = TRUE) 

df.long <- 
    reshape(df, varying = names(df)[2:3], 
     direction = 'long', 
     #ids = 'question', 
     times = 2015:2016, 
     v.names = 'perc', 
     timevar = 'year' 
     ) 

ggplot(df.long, aes(x = perc, y = question))+ 
    geom_line(aes(group = question))+ 
    geom_point(aes(colour = factor(year)), size = 2)+ 
    theme_bw()+ 
    scale_color_brewer(palette = 'Set1', name = 'Year') 

enter image description here

3

Wenn Sie Facette von Frage und setzen Jahr auf die X-Achse, können Sie die Trendrichtung mit Farbe markieren und die X-Achse verwenden, um den Lauf der Zeit anzuzeigen.

library(reshape2) 
library(dplyr) 
library(ggthemes) 

ggplot(df %>% melt(id.var="question") %>% 
     group_by(question) %>% 
     mutate(Direction=ifelse(diff(value)>0,"Up","Down")), 
     aes(x=gsub("y","",variable), y=value, color=Direction, group=question)) + 
    geom_point(size=2) + 
    geom_path(arrow=arrow(length=unit(0.1,"in")), show.legend=FALSE) + 
    facet_grid(. ~ question) + 
    theme_tufte() + 
    theme(strip.text.x=element_text(size=15)) + 
    guides(color=guide_legend(reverse=TRUE)) + 
    scale_y_continuous(limits=c(0,100)) + 
    labs(x="Year", y="Value") 

Mit dieser Codierung von Ästhetik, brauchen Sie vermutlich nicht die Legende und das Hinzufügen von Pfeilen zu den Liniensegmenten als auch überflüssig sein können, aber ich habe sie zur Illustration in der linken.

enter image description here

Verwandte Themen