2016-06-29 8 views
5

Mam zestaw danych z wynikami na pytania zadawane przez dwa lata. Każde pytanie ma wartość 2015 i wartość 2016. Chciałbym wydrukować każdy, a następnie pokazać różnice między wartością 2015 a wartością z 2016 roku. Czy wynik wzrósł, czy spadł, czy pozostanie taki sam? Pomyślałem, że użyteczne może być łączenie par punktów za pomocą linii (lub strzałki), aby pokazać kierunek zmian, ale trudno mi jest uzyskać ggplot, aby to zrobić. Oto mój przykład kodu:ggplot2: Pokaż różnicę wartości w czasie ze strzałką

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 

Różne podejścia do wizualizacji są mile widziane.

+0

nie mam czasu, aby napisać odpowiedź teraz, ale jeśli masz sporo pytań (trzeba wspomnieć ~ 100 w komentarzu poniżej) Chciałbym zrobić rozrzutu 2015 punktów (x) vs wyniki 2016 (y). Dodaj 45-stopniową linię, a kropki powyżej linii są poprawione, a korelacja między tymi dwoma latami jest wyraźnie widoczna (a także wartości odstające powinny się wyróżniać). – Gregor

+0

@ self; Może być interesujące dla Ciebie http://stackoverflow.com/questions/38109623/remove-legend-elements-of-one-specific-geom-show-legend-false-does-not-do-t/38110017#38110017 – Alex

Odpowiedz

2

Jest jeszcze trochę brzydki i wymaga dostrojenia, ale dostał strzały;)

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

Bardzo fajnie. Naprawdę to lubię. – oneself

1

Może coś takiego? Konieczne jest pewne przekształcenie danych i dbanie o nie za pomocą funkcji gather z bardzo użytecznej biblioteki 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

jest bardzo miłym viz. Łatwo jest zidentyfikować jedno pytanie, które miało wzrost. – bouncyball

+2

To jest miłe. Jednak w prawdziwych danych mam wiele więcej pytań (~ 100) i tekst dla każdego jest dłuższy niż "q1". Myślę więc, że wizualizacja go w ten sposób będzie zbyt zagracona. – oneself

3

Myślę, że "hantle" wykres będzie działać, too. Tutaj zmieniłem twoje dane na długie.

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

Jeśli facet przez pytania i umieścić roku na Oś X, możesz podświetlić kierunek trendu kolorem i użyć osi X, aby pokazać upływ czasu.

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

Z tego kodowania estetyki, to prawdopodobnie nie trzeba legendę i dodanie strzałek do odcinków może być zbędny, a także, ale zostawiłem je w celach ilustracyjnych.

enter image description here