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()
但是,级别的顺序是按字母顺序排列的,而不是按频率排列的。使用 library(plyr) 中的 count 我可以创建一个新的 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中的每个factor/column额外提供了一个data.frame,我觉得必须有更简单的方法。
2.) 绘图时,如何重命名图例标签并确保为它们分配正确的因子水平?如果我使用
scale_fill_manual(labels=c("Name of AB", "Name of BC", "Name of CD", "Name of DE","Name of EF"))
标签与正确的级别不相关。这里图例中的第一个条目将是 "DE",因为它是频率最高的级别,但标签将显示 "Name of AB",如 scale_fill_manual.[=39 中所定义=] 我可以每次手动检查标签的顺序,但必须有一种自动方式吗?
包 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"))
你想要 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)))
您还有一个使用库 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"))
请注意,饼图被认为是邪恶的(你可以 google 那个),你可以用简单的条形图传达相同的信息:
ggplot(df, aes(x = fct_infreq(Var1), fill = fct_infreq(Var1))) +
geom_bar(width = 1, colour = "black", show.legend = FALSE) +
xlab("Var1")
我有一个 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()
但是,级别的顺序是按字母顺序排列的,而不是按频率排列的。使用 library(plyr) 中的 count 我可以创建一个新的 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中的每个factor/column额外提供了一个data.frame,我觉得必须有更简单的方法。
2.) 绘图时,如何重命名图例标签并确保为它们分配正确的因子水平?如果我使用
scale_fill_manual(labels=c("Name of AB", "Name of BC", "Name of CD", "Name of DE","Name of EF"))
标签与正确的级别不相关。这里图例中的第一个条目将是 "DE",因为它是频率最高的级别,但标签将显示 "Name of AB",如 scale_fill_manual.[=39 中所定义=] 我可以每次手动检查标签的顺序,但必须有一种自动方式吗?
包 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"))
你想要 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)))
您还有一个使用库 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"))
请注意,饼图被认为是邪恶的(你可以 google 那个),你可以用简单的条形图传达相同的信息:
ggplot(df, aes(x = fct_infreq(Var1), fill = fct_infreq(Var1))) +
geom_bar(width = 1, colour = "black", show.legend = FALSE) +
xlab("Var1")