[英]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.