簡體   English   中英

R:按級別頻率和繪圖排序因子

[英]R: Sorting factor by level frequency and plotting

我有一個data.frame有幾個因素,如:

df<-data.frame(Var1=as.factor(sample(c("AB", "BC", "CD", "DE", "EF"), 1000, replace=TRUE)))

summary(df$Var1)
 AB  BC  CD  DE  EF 
209 195 178 221 197

我想在data.frame中繪制每個因子的級別頻率,如下所示:

ggplot(df, aes(x=factor(1), fill=factor(Var1)))+
       geom_bar(width=1, colour="black")+
       coord_polar(theta="y")+
       theme_void()

但是,級別的順序是按字母順序而不是按頻率。 使用庫中的 count (plyr)我可以創建一個新的data.frame,它給出了每個級別的頻率:

df_count <-count(df, "Var1")
Var1 freq
1   AB  209
2   BC  195
3   CD  178
4   DE  221
5   EF  197

然后我可以使用它重新排序

df_count$Var1<-factor(df_count$Var1, levels=df_count$Var1[order(df_count$freq, decreasing=TRUE)])

在繪制時給出了我想要的,每個級別的排序頻率。

1.)這是最優雅的解決方案嗎? 它為我的原始data.frame中的每個因子/列提供了額外的data.frame,我覺得必須有一個更簡單的方法。

2.)在繪圖時,如何重命名圖例標簽並確保它們被分配了正確的因子水平? 如果我使用

scale_fill_manual(labels=c("Name of AB", "Name of BC", "Name of CD", "Name of DE","Name of EF"))

標簽與正確的級別無關。 這里圖例中的第一個條目是“DE”,因為它是頻率最高的級別,但標簽會在scale_fill_manual中定義“AB的名稱” 我每次都可以手動檢查標簽的順序,但必須有自動方式嗎?

你想要reorder() ,我想。 通常, reorder(x,y,FUN)根據將函數FUN應用於第二變量y的結果來改變因子x的級別的順序。 在這種情況下,您可以使用FUN=length ,並且您對y使用的內容並不重要。

設置數據(我選擇修改概率以使結果更清晰):

set.seed(101)
df <- data.frame(Var1=as.factor(sample(c("AB", "BC", "CD", "DE", "EF"),
                            prob=c(0.1,0.5,0.2,0.05,0.15),
                                   1000, replace=TRUE)))

基本情節(錯誤的順序):

library(ggplot2)
print(g1 <- ggplot(df, aes(x=factor(1), fill=Var1))+
   geom_bar(width=1, colour="black")+
   coord_polar(theta="y")+
   theme_void())

在此輸入圖像描述

現在重新排序:

df$Var1 <- reorder(df$Var1,df$Var1,FUN=length)
levels(df$Var1)
## [1] "DE" "AB" "EF" "CD" "BC"

檢查訂單是否正確:

sort(table(df$Var1))
##  DE  AB  EF  CD  BC 
##  46 105 163 189 497 

打印新圖(使用%+%粘貼新數據並使用guide_legend()翻轉圖例的順序:您還可以使用function(x) -length(x)作為FUN來更改圖中的級別順序第一名)。

print(g1 %+% df + 
    scale_fill_discrete(guide=guide_legend(reverse=TRUE)))

在此輸入圖像描述

package forcats中的函數可以幫助處理因子順序。 特別是, fct_infreq將根據每個級別的頻率設置級別的順序。

library(forcats)

df$Var1 = fct_infreq(df$Var1)

您可以使用命名向量來避免scale_*_manual函數中的順序。

scale_fill_manual(labels = c(AB = "Name of AB", 
                      BC = "Name of BC", 
                      CD = "Name of CD", 
                      DE = "Name of DE", 
                      EF = "Name of EF"))

所以你的情節代碼可能看起來像

ggplot(df, aes(x = factor(1), fill = fct_infreq(Var1) ))+
    geom_bar(width = 1, colour = "black")+
    coord_polar(theta = "y")+
    theme_void() +
    scale_fill_discrete(labels = c(AB = "Name of AB", 
                          BC = "Name of BC", 
                          CD = "Name of CD", 
                          DE = "Name of DE", 
                          EF = "Name of EF"))

您還可以使用庫forcats和函數fct_infreq獲得一個簡單的解決方案。

library(forcats)
ggplot(df, aes(x = factor(1), fill = fct_infreq(Var1)))+
  geom_bar(width = 1, colour = "black")+
  coord_polar(theta = "y")+
  theme_void() +
  guides(fill = guide_legend(title = "Var1"))

餅形圖

請注意,餅圖被認為是邪惡的(您可以谷歌),您可以使用簡單的條形圖傳達相同的信息:

ggplot(df, aes(x = fct_infreq(Var1), fill = fct_infreq(Var1))) +
  geom_bar(width = 1, colour = "black", show.legend = FALSE) +
  xlab("Var1")

條形圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM