如何将因子水平设置为它们在数据框中出现的顺序?

时间:2014-10-20 15:41:50

标签: r

我想使用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)

F学校(25)

B学校(28)

E学校(30)

由于我想对多个图表执行此操作,我想要找到一种自动执行此操作的方法,而不必每次都重新设置因子级别。

3 个答案:

答案 0 :(得分:7)

解决此问题的一种方法是将ggplot来电更改为

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

为避免每次都输入此内容,您可以创建一个功能

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

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

调用它

请注意,这会将因子的第一级放在图的底部。如果您希望它位于顶部,则需要将f更改为function(x) factor(x, levels = rev(unique(x)))

答案 1 :(得分:6)

在调用forcats之前,将以下ggplot()管道添加到代码中。

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

fct_inorder()以数据框顺序创建因子级别,fct_rev()将它们反转,以便绘图朝正确的方向发展。

答案 2 :(得分:0)

一种方法是制作school列和有序因子:

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

enter image description here