I want to create a heat map using ggplot however I want to order the y-axis by the number of observations. I order the dataframe by the column N and add the number of observations to the group name so that it appears in the axis label. When I plot the data it re-orders based on the group name. Is there a way to set factor levels based on the order they appear in the data frame?
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")
One way around this is to change your
ggplot call to
ggplot(df, aes(variable, factor(school, levels = unique(school)))) + ...
To avoid typing this every time, you can create a function
f <- function(x) factor(x, levels = unique(x))
and then call it by
ggplot(df, aes(variable, f(school))) + ...
Note that this will place the first level of the factor at the bottom of the plot. If you want it at the top, you need to change
function(x) factor(x, levels = rev(unique(x)))