ggplot的数据框变量顺序

时间:2017-06-22 22:57:54

标签: r dataframe ggplot2

我有些惶恐地问这个问题,但我确实看过其他问题并找不到似乎对我有用的例子。

我想让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))

我希望mygames和相应的值按区域排序,然后是子区域,然后my_order(作为打破平局)在图中排序(至少现在没有,在图表中显示任何这些) ),但my_name似乎继续以字母顺序出现,无论我是否尝试使用编排(来自dplyr)或订购。我意识到我没有为my_order列添加任何代码,但由于排序的第一个级别没有工作,我想我会推迟。

我正在寻找y轴的顺序(从上到下):

qymni fswvl jjkcs ouasm xziqg fqvar

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

1 个答案:

答案 0 :(得分: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 = TRUE调用中使用order()才能使订单自上而下。

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