2017-06-22 72 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做到這一點,但我很樂意使用這個解決方案。 –