2014-10-20 11 views
5

Ich möchte eine Heatmap mit ggplot erstellen, aber ich möchte die y-Achse nach der Anzahl der Beobachtungen ordnen. Ordne den Datenrahmen nach der Spalte N an und füge dem Gruppennamen die Anzahl der Beobachtungen hinzu, so dass er in der Achsenbeschriftung erscheint. Wenn ich die Daten grafisch darstelle, sortiert sie sie basierend auf dem Gruppennamen neu. Gibt es eine Möglichkeit, Faktorstufen basierend auf der Reihenfolge im Datenrahmen festzulegen?Wie setze ich Faktorstufen in der Reihenfolge, in der sie in einem Datenrahmen erscheinen?

Einige Daten:

library(dplyr) 
library(tidyr) 
library(ggplot2) 

school <- c("School A", "SChool B", "School C", "School D", "School E", "School F") 
N <- c(25,28,12,22,30,25) 
var1 <- c(1,0,1,1,0,1) 
var2 <- c(0,0,0,1,0,1) 
var3 <- c(0,1,0,1,1,1) 

df <- tbl_df (data.frame (school, N, var1, var2, var3)) 

df <- arrange (df, N) %>% 
    gather (variable, value, var1:var3) 

df$school <- paste0 (df$school, " (", df$N, ")") 

df <- select (df, school, variable, value) 

ggplot(df, aes(variable, school)) + geom_tile(aes(fill = value), colour = "white") + 
    scale_fill_gradient(low = "white",high = "steelblue") 

Letztlich möchte ich die Reihenfolge der Schulen sein:

Schule C (12)

Schule D (22)

Schule A (25)

Schule F (25)

Schule B (28)

Schule E (30)

Während ich dies für mehrere Plots tun möchte Ich möchte einen Weg finden, dies automatisch zu tun und müssen nicht erneut eingestellt Faktorstufen jedes Mal .

Antwort

4

Ein Weg, um dieses ist Ihr ggplot Aufruf

ggplot(df, aes(variable, factor(school, levels = unique(school)))) + ... 

zu ändern, um diese jedes Mal zu vermeiden eingeben, können Sie eine Funktion

f <- function(x) factor(x, levels = unique(x)) 

erstellen und sie dann anrufen, indem ggplot(df, aes(variable, f(school))) + ...

Beachten Sie, dass dadurch die erste Ebene des Faktors am unteren Ende des Diagramms platziert wird. Wenn Sie es an der Spitze wollen, müssen Sie f-function(x) factor(x, levels = rev(unique(x)))

+0

Dank @konvas - funktionierte perfekt. – Greg

0

Eine Möglichkeit, die school Spalte zu machen wäre zu ändern und bestellt Faktor:

df$school <- reorder(df$school, rep(6:1, length.out=length(k)), order=TRUE) 

enter image description here

2

Fügen Sie den folgenden forcats Rohr der Code kurz vor dem Anruf an ggplot().

library(forcats) 
df$school <- fct_inorder(df$school) %>% fct_rev() 

fct_inorder() schafft Faktorstufen in Datenrahmen um und fct_rev() kehrt sie so die Handlung in die richtige Richtung geht.

Verwandte Themen