2017-06-05 3 views
1

ich die folgenden Daten auf ggplot Plotten:r - ggplot2 - Hinzufügen Unterschiede auf gruppierte Balkendiagramme

library(ggplot2) 

DF <- structure(list(Type = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L), .Label = c("Observed", "Simulated"), class = "factor"), 
    variable = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L), .Label = c("EM to V6", 
    "V6 to R0", "R0 to R4", "R4 to R9"), class = "factor"), value = c(28, 
    30, 29, 35, 32, 34, 26, 29)), row.names = c(NA, -8L), .Names = c("Type", 
"variable", "value"), class = "data.frame") 

ggplot(DF, aes(variable, value)) + 
     geom_bar(aes(fill = Type), position = "dodge", stat="identity", width=.5) + 
     geom_text(aes(label=value, group=Type), position=position_dodge(width=0.5), vjust=-0.5) + 
     theme_bw(base_size = 18) + 
     ylab('Duration (days)') + xlab('Growth stages') 

enter image description here

ich mich gefragt, ob es eine grafische Art und Weise ist es, die Unterschiede zwischen den einzelnen Gruppen hinzufügen von Bars zum Diagramm?

Dies ist der Datenrahmen mit den Differenzen hinzugefügt werden:

DF2 <- data.frame(variable=c("EM to V6", "V6 to R0", "R0 to R4", "R4 to R9"), value=c(2,6,2,3) 

Der letzte Chart wie folgt aussehen etwas würde (die farbigen Balken bemerken):

enter image description here

Quelle: https://www.excelcampus.com/charts/variance-clustered-column-bar-chart/

Ist das mit ggplot möglich?

+1

fügen Sie einfach eine Schicht von Bars (zwei jeweils bei maximaler Höhe pro Gruppe) hinter denen mit einer etwas kleineren Breite in einer anderen Farbe – rawr

Antwort

2

Als rawr vorgeschlagen, können Sie eine Schicht von Balken hinter den aktuellen, mit einer etwas kleineren Breite hinzu:

library(tidyverse) 
diff_df = DF %>% 
    group_by(variable) %>% 
    spread(Type, value) %>% 
    mutate(diff = Simulated - Observed) 

ggplot(DF, aes(variable, value)) + 
    geom_bar(aes(y = Simulated), data = diff_df, stat = "identity", fill = "grey80", width = 0.4) + 
    geom_bar(aes(fill = Type), position = "dodge", stat="identity", width=.5) + 
    geom_text(aes(label=value, group=Type), position=position_dodge(width=0.5), vjust=-0.5) + 
    geom_text(aes(label = diff, y = Simulated), vjust=-0.5, data = diff_df, hjust = 2, colour = scales::muted("red")) + 
    theme_bw(base_size = 18) + 
    ylab('Duration (days)') + xlab('Growth stages') 

aktualisierte Code mit Beobachtet manchmal zu behandeln höher als Simulated:

library(tidyverse) 
diff_df = DF %>% 
    group_by(variable) %>% 
    spread(Type, value) %>% 
    mutate(diff = Simulated - Observed, 
      max_y = max(Simulated, Observed), 
      sim_higher = Simulated > Observed) 

ggplot(DF, aes(variable, value)) + 
    geom_bar(aes(y = max_y), data = diff_df, stat = "identity", fill = "grey80", width = 0.4) + 
    geom_bar(aes(fill = Type), position = "dodge", stat="identity", width=.5) + 
    geom_text(aes(label=value, group=Type), position=position_dodge(width=0.5), vjust=-0.5) + 
    geom_text(aes(label = diff, y = max_y), vjust=-0.5, data = diff_df %>% filter(sim_higher), 
       hjust = 2, colour = scales::muted("red")) + 
    geom_text(aes(label = diff, y = max_y), vjust=-0.5, data = diff_df %>% filter(!sim_higher), 
       hjust = -1, colour = scales::muted("red")) + 
    theme_bw(base_size = 18) + 
    ylab('Duration (days)') + xlab('Growth stages') 
+0

Das ist super, danke! Aber was ich habe ein Szenario, wo das simulierte niedriger ist als beobachtet? Wir können dies reproduzieren, indem wir den ursprünglichen Datensatz ändern: 'DF [7,3] <- 29; DF [8,3] <- 26 "und führe deinen Code erneut aus! – thiagoveloso

+1

Richtig, es erfordert ein bisschen zusätzliche Arbeit, aber ich konnte es relativ leicht erreichen. Es wird meistens nur das Maximum der beiden Variablen berechnet und als y-Wert verwendet, aber dann mussten die Labels einige zusätzliche Optimierungen vornehmen. – Marius

+0

Wow, das ist kein Code. Das ist ein Meisterwerk! Vielen Dank für den zusätzlichen Aufwand, um diese Frage zu beantworten. Bitte werfen Sie einen Blick auf das endgültige Bild mit meinen tatsächlichen Daten: http://imgur.com/APg0xrv – thiagoveloso

Verwandte Themen