【上一篇:58.关于学习因子的一个有用的数据集gss_cat】
【下一篇:60.关于调整因子的属性levels的order(二)】
接下来将介绍forcats包中对因子的levels属性的order进行更改的几个函数:fct_reorder()、fct_reorder2()、fct_relevel()、fct_infreq()、fct_rev()。
PS:这一类函数中fct可以理解为factor中的字母。
在绘图中,调整factor的levels顺序是很实用的。
首先是fct_reorder()和fct_reorder2(),两者的Usage如下:
fct_reorder(.f, .x, .fun = median, ..., .desc = FALSE)
fct_reorder2(.f, .x, .y, .fun = last2, ..., .desc = TRUE)
这两个函数的功能是通过对另一个变量排序来重排levels的顺序。
fct_reorder()适用于一维展示(x轴方向或者y轴方向)的情况,此种情况下,因子的顺序映射的是位置,例如柱状图中横坐标上每个柱子的排序,又如下例中研究gss_cat数据集中每天看电视的时间与relig的关系:
library(ggpubr)
p1<- gss_cat %>% group_by(relig) %>%
summarise(
age = mean(age, na.rm = TRUE),
tvhours = mean(tvhours, na.rm = TRUE),
n = n()
) %>% ggplot(aes(tvhours, relig)) + geom_point()
p2<-gss_cat %>% group_by(relig) %>%
summarise(
age = mean(age, na.rm = TRUE),
tvhours = mean(tvhours, na.rm = TRUE),
n = n()
) %>% ggplot(aes(tvhours, fct_reorder(relig, tvhours))) + geom_point()
ggarrange(p1,p2)
根据x的值对y轴进行排序
上图中,左图(p1)显得很乱,右图(p2)中可以很清楚地看出哪个reigion平均看电视的时间最长或最短。
fct_reorder(.f, .x, .fun = median, ..., .desc = FALSE)
.f :要排序的因子向量
.x :按照一个数值向量对因子进行排序,其实是对.f进行排序以使得.x以升序(默认)排列,
设置.desc=TRUE使.x按降序排列
.fun:如果一个levels对应多个.x中的值,则按照median值对levels进行排序
fct_reorder2()适用于二维展示(x轴和y轴两个方向上综合调整),此时,因子的顺序映射的不再是位置了,而是集合对象和legend的对应关系。下面我们将举例说明(婚姻状况与年龄的关系):
by_age <- gss_cat %>%
filter(!is.na(age)) %>%
count(age, marital) %>%
group_by(age) %>%
mutate(prop = n / sum(n))
p3<-ggplot(by_age, aes(age, prop, colour = marital)) +
geom_line(na.rm = TRUE)
p4<-ggplot(by_age, aes(age, prop, colour = fct_reorder2(marital, age, prop))) +
geom_line() +
labs(colour = "marital")
ggarrange(p3,p4)
线与图例的关系
图形的形状并没有变化,线的颜色(图例)与分类变量的对应关系发生变化,上右图图例中从上到下依次和最大的x对应的y相照应。
fct_reorder2(.f, .x, .y, .fun = last2, ..., .desc = TRUE)
.f : 要排序的因子
.x和.y:根据最大的.x对应的.y(默认升序)对.f进行排序
.fun:如果一个levels对应多个.x和.y,则用.fun函数决定用哪个y值排序
last2()查找按x排序后y的最后一个值;first2()查找第一个值
【上一篇:58.关于学习因子的一个有用的数据集gss_cat】
【下一篇:60.关于调整因子的属性levels的order(二)】
网友评论