2015-01-30 10 views
5

Eine Umfrage mit 5 Fragen wird verwaltet. Die Fragen teilen die gleichen möglichen Antworten. Hier sind die Daten, die für das Plotten mit ggplot2 umgestaltet wurden.Gestapeltes Barplot x basierend auf Füllwerten mit ggplot2 neu anordnen

library(tidyr) 
library(magrittr) 

data <- data.frame(ID = c(1:500), 
        q1 = factor(sample(c(1:4), 500, replace = T), 
           labels = c("A", "B", "C", "D")), 
        q2 = factor(sample(c(1:4), 500, replace = T), 
           labels = c("A", "B", "C", "D")), 
        q3 = factor(sample(c(1:4), 500, replace = T), 
           labels = c("A", "B", "C", "D")), 
        q4 = factor(sample(c(1:4), 500, replace = T), 
           labels = c("A", "B", "C", "D")), 
        q5 = factor(sample(c(1:4), 500, replace = T), 
           labels = c("A", "B", "C", "D"))) %>% 
gather(question, value, q1:q5) 

Ich möchte die Reihenfolge der Fragen basierend auf der Anzahl einer bestimmten Antwort sortieren. Anstatt also diese ...

library(ggplot2) 

ggplot(data, aes(x = question , fill = value)) + 
    geom_bar() + 

    theme(panel.background = element_rect(fill = "white")) + 
    scale_fill_manual("Value", values = c("#2171B5", "#6BAED6", "#BDD7E7", 
            "#EFF3FF")) 

enter image description here

... möchte ich die Reihenfolge der Fragen entlang der x-Achse werden auf der Grundlage der Anzahl der Antwort = D, zum Beispiel.

+2

Ich würde 1) precomputing die Menge im Voraus empfehlen; 2) Umsortierung durch Einstellung von 'scale_x_manual'. – tonytonov

Antwort

6

Verstanden. Nach Anzahl der Antworten sortiert = A, im folgenden Beispiel.

data$question <- reorder(dataf$question, data$value, function(x) max(table(x)[1])) 

    ggplot(heatDf, aes(x = question, fill = value)) + 
     geom_bar() + 
     theme(panel.background = element_rect(fill = "white")) + 
     scale_fill_manual("", values = c("#2171B5", "#6BAED6", "#BDD7E7", 
             "#EFF3FF", "grey30")) 

enter image description here

+1

können Sie auch 'ggplot (Daten, AES (x = Faktor (Frage, levels = as.character (Anzahl (Daten, Frage, Wert)%>% Ungroup%>% Filter (Wert ==" D ")%> % arrange (n)%>%. $ question), ordered = TRUE) , fill = value)) aber normalerweise ist es besser, dies außerhalb von ggplot zu tun, wie Sie es hier getan haben. – hrbrmstr

Verwandte Themen