R:按级别频率和绘图排序因子

标签 r dataframe ggplot2 plyr r-factor

我有一个 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()

但是,级别的顺序是按字母顺序排列的,而不是按频率排列的。使用库(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 名称”。我每次都可以手动检查标签的顺序,但必须有一种自动方式吗?

最佳答案

包 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"))

关于R:按级别频率和绘图排序因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42497063/

相关文章:

r - Brew 和 knit 一份 PDF 报告由带有特殊字符的变量分割 (å æ ø) - 编码问题

r - 防止 R igraph 添加零顶点

r - 如何从字符串向量中创建一组唯一的名称?

python - 通过比较更多列值(标题名称之间有空格)来删除行

r - 您可以在 R 中将 geom_bar 饼图与 geom_point 图结合起来吗?

r - 如何将覆盖其他标签的箭头发送到 geom_label_repel 的后面?

r - 利用可用数据并忽略缺失数据来构建分类器

r - 如何通过分类变量过滤 R 中的 data.frame?

python - 具有重复列名的 Pandas sumif

r - ggplot2:贴标机中的摄氏度符号,knitr 中带有 dev ="tikz"选项