2017-06-22 73 views
0

我对此提出了一些怀疑,但我确实看过其他问题,并没有找到似乎适用于我的示例。ggplot的数据帧变量订单

我想在ggplot的y轴上的字符标签基于数据框的其他列排序。我相信这是一个在使用ggplot之前正确设置因子和级别的问题,但我对如何做到这一点的具体细节有困难。

下面是一个简化的例子(对潜在不似乎是有意义的点):

library(tidyverse) 
library(ggplot2) 

set.seed(1) 
num_rows <- 12 
sample_names <- do.call(paste0, replicate(5, sample(letters, num_rows, TRUE), FALSE)) 
df1 <- data.frame(region=sample(c("N", "S", "E", "W"), num_rows, replace = TRUE), 
        sub_region=sample(c("High", "Medium", "Low"), num_rows, replace = TRUE), 
        my_order = seq(1,num_rows), 
        my_name = sample_names, 
        var_1 = sample(100, num_rows, replace = TRUE)) 

#try using arrange 
df2 <- df1 %>% arrange(factor(df1$region, levels = c("N","E","S","W")), 
         factor(df1$sub_region, levels = c("High","Medium","Low"))) 
df2 %>% ggplot() + geom_point(aes(x = var_1, y = my_name, color=sub_region)) 

#try using order 
df3 <- df1 
df3$region <- factor(df1$region, levels = c("N","E","S","W")) 
df3$sub_region <- factor(df1$sub_region, levels = c("High","Medium","Low")) 
df4 <- df3[order(df1$region, df1$sub_region, df1$my_order),] 
df4 %>% ggplot() + geom_point(aes(x = var_1, y = my_name, color=sub_region)) 

我希望具有由区域,则子区域,然后my_order(排序my_names和相应的值(至少现在不显示图表中的任何一个),但my_name似乎继续以字母顺序显示,无论我尝试使用排列(来自dplyr)还是顺序。我意识到我没有为my_order列添加任何代码,但由于排序的第一个级别不起作用,我以为我会坚持这一点。

我寻找y轴是按照该顺序(从顶部向下):

qymni fswvl jjkcs ouasm xziqg fqvar

显然,我做错了什么,但我不确定是什么。我将不胜感激任何帮助。另外,我是否正确,一旦我有这个工作正常,使用group_by并从dplyr总结将保留my_names的顺序?

回答

1

首先,您可以在原始数据框中为region等列设置因子级别的顺序。然后,你不会最终得到相同数据的所有这些不同的稍微修改版本。然后排序数据帧你想要的,并使用forcats::fct_inorder基于在数据帧他们目前的顺序重新分配为my_name因子水平:

library(tidyverse) 
library(ggplot2) 
library(forcats) 

set.seed(1) 
num_rows <- 12 
sample_names <- do.call(paste0, replicate(5, sample(letters, num_rows, TRUE), FALSE)) 
df1 <- data.frame(region=sample(c("N", "S", "E", "W"), num_rows, replace = TRUE), 
        sub_region=sample(c("High", "Medium", "Low"), num_rows, replace = TRUE), 
        my_order = seq(1,num_rows), 
        my_name = sample_names, 
        var_1 = sample(100, num_rows, replace = TRUE)) 

df1$region <- factor(df1$region, levels = c("N","E","S","W")) 
df1$sub_region <- factor(df1$sub_region, levels = c("High","Medium","Low")) 
df1 <- df1[order(df1$region, df1$sub_region, df1$my_order, decreasing = TRUE), ] 
# Order my_name levels based on current order 
df1$my_name = fct_inorder(df1$my_name) 
df1 %>% ggplot() + geom_point(aes(x = var_1, y = my_name, color=sub_region)) 

注意,我不得不使用decreasing = TRUEorder()调用来获取订单从上到下。

对于分类变量,如my_name,它是决定订单ggplot的订单的因子水平顺序,而不是它们在数据框中的当前顺序,这正是您在示例代码中正在改变的顺序。这使得当您需要控制图中的顺序时,forcats中的工具非常有用。

+0

谢谢!我不会想出这个,因为我发现forcats的文档有点稀疏,我没有意识到我需要以这种方式使用顺序。我认为有可能没有forcats做到这一点,但我很乐意使用这个解决方案。 –