2014-10-20 28 views
5

我想創建一個使用ggplot的熱圖,但我想通過觀察數量來排序y軸。我在列N中排列數據框,並將觀察數添加到組名,以便它出現在軸標籤中。當我繪製數據時,它會根據組名重新排序。有沒有辦法根據它們在數據框中出現的順序來設置因子水平?如何將因子水平設置爲它們在數據框中出現的順序?

一些數據:

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

最終欲學校的順序爲:

學校C(12)

學校d(22)

學校A(25 )

School F(25)

學校B(28)

學校E(30)

正如我想的多條曲線我想找到一種方法來自動執行此操作,而不必重新設置因子水平在每次這樣做。解決此

回答

4

一種方法是你ggplot電話更改爲

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

爲了避免這種情況,每次打字,你可以創建一個功能

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

然後ggplot(df, aes(variable, f(school))) + ...

叫它

請注意,這會將該因子的第一個水平放置在圖的底部。如果你想讓它在頂部,你需要改變ffunction(x) factor(x, levels = rev(unique(x)))

+0

謝謝@konvas - 完美工作。 – Greg 2014-10-20 16:42:13

0

的一種方法是使school列,並下令因素:

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

enter image description here

2

以下forcats管加入在撥打ggplot()之前的代碼。

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

fct_inorder()在數據幀順序創建因子水平和fct_rev()反轉他們這樣的情節去在正確的方向。