2016-06-29 41 views
5

Ho un set di dati con punteggi a domande poste in due anni. Ogni domanda ha un valore del 2015 e un valore del 2016. Vorrei tracciare ciascuno e quindi mostrare il diverso tra il valore del 2015 e il valore del 2016. Il punteggio sale o scende o rimane lo stesso? Stavo pensando che potrebbe essere utile connettere coppie di punti con una linea (o una freccia) per mostrare la direzione del cambiamento, ma sto facendo fatica a ottenere ggplot per farlo. Ecco il mio esempio di codice:ggplot2: mostra la differenza di valori nel tempo con una freccia

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 

Diversi approcci per la visualizzazione di questo sono i benvenuti.

+0

non ho il tempo di scrivere una risposta in questo momento, ma se si dispone di un discreto numero di domande (si parla ~ 100 in un commento qui sotto) vorrei fare un grafico a dispersione di 2015 punteggi (x) rispetto ai punteggi del 2016 (y). Aggiungi una linea di 45 gradi e i punti sopra la linea sono miglioramenti, e la correlazione tra i due anni è chiaramente visibile (e anche i valori anomali dovrebbero risaltare). – Gregor

+0

@onself; Potrebbe essere interessante per te http://stackoverflow.com/questions/38109623/remove-legend-elements-of-one-specific-geom-show-legend-false-does-not-do-t/38110017#38110017 – Alex

risposta

2

E 'ancora un po' brutto e ha bisogno di messa a punto ma ha ottenuto frecce;)

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

Molto interessante. Mi piace molto questo. – oneself

1

Forse qualcosa del genere? Alcuni rimodellamento dei dati sono necessari e curati con la funzione gather dalla libreria molto utile tidyr.

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

Questo è una cosa molto bella. È facile identificare l'unica domanda che ha avuto un aumento. – bouncyball

+2

Questo è bello. Tuttavia, nei dati reali, ho molte più domande (~ 100) e loro testo per ciascuna è più lungo di "q1". Quindi, penso che visualizzarlo in questo modo sarà troppo confuso. – oneself

3

Penso che un grafico "manubrio" avrebbe funzionato, anche. Qui ho rimodellato i tuoi dati a lungo.

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

Se sfaccettatura dalla domanda e mettere anno sul asse x, è possibile evidenziare la direzione della tendenza con il colore e utilizzare l'asse x per mostrare il passare del tempo.

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") 

Con questa codifica di estetica, probabilmente non hanno bisogno della leggenda, e l'aggiunta di frecce per i segmenti di linea possono essere superfluo pure, ma li ho lasciati in per l'illustrazione.

enter image description here