我想用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")
Run Code Online (Sandbox Code Playgroud)
最终我希望学校的顺序是:
C学校(12)
D学校(22)
学校A(25)
F学校(25)
学校B(28)
E学校(30)
由于我想为多个图表执行此操作,我想要找到一种自动执行此操作的方法,而不必每次都重新设置因子级别.
解决此问题的一种方法是将您的ggplot通话更改为
ggplot(df, aes(variable, factor(school, levels = unique(school)))) + ...
Run Code Online (Sandbox Code Playgroud)
为避免每次都输入此内容,您可以创建一个函数
f <- function(x) factor(x, levels = unique(x))
Run Code Online (Sandbox Code Playgroud)
然后通过它来调用它 ggplot(df, aes(variable, f(school))) + ...
请注意,这会将因子的第一级放在图的底部.如果您想要它在顶部,您需要更改f为function(x) factor(x, levels = rev(unique(x)))
将以下forcats管道添加到调用之前的代码中ggplot().
library(forcats)
df$school <- fct_inorder(df$school) %>% fct_rev()
Run Code Online (Sandbox Code Playgroud)
fct_inorder()以数据框顺序创建因子级别并将其fct_rev()反转,以使绘图朝向正确的方向.
| 归档时间: |
|
| 查看次数: |
3620 次 |
| 最近记录: |