fct_reorder报错:.f需为因子/字符向量,ggplot条形图重排问题
条形图排序问题及解决方法
问题描述
我从940行数据集中统计得到4个变量的均值汇总表:
activity_means <- activity_daily_clean %>% summarize(sedentary = mean(sedentary_minutes), lightly_active = mean(lightly_active_minutes), fairly_active = mean(fairly_active_minutes), very_active = mean(very_active_minutes))
尝试绘制条形图时,活动强度等级(sedentary - lightly active - fairly active - very active)的顺序混乱:
act_means_df <- data.frame( activity_intensity=c("sedentary", "lightly active", "fairly active", "very active"), intens_means=c(991.2106, 192.8128, 13.56489, 21.16489) ) ggplot(act_means_df)+ geom_col(aes(x=activity_intensity, y=intens_means))
按照指南尝试用fct_reorder重排条形图时出现错误:
act_means_df <- data.frame( activity_intensity=c("sedentary", "lightly active", "fairly active", "very active"), intens_means=c(991.2106, 192.8128, 13.56489, 21.16489) ) %>% mutate(f_act_int = factor(activity_intensity)) act_means_df %>% fct_reorder(f_act_int, intens_means) %>% ggplot(aes(x=f_act_int, y=intens_means))+ geom_bar(stat="identity", fill="#f68060", alpha=.6, width=.4) + coord_flip() + xlab("") + theme_bw()
错误信息:
Error in
fct_reorder():
!.fmust be a factor or character vector, not a data frame
另外,单独执行class(f_act_int)时提示“object 'f_act_int' not found”,但用str(act_means_df)能确认f_act_int是因子类型。
错误原因分析
fct_reorder用法错误:fct_reorder的第一个参数需要传入单个因子/字符向量,但你直接将整个数据框通过管道传给它,导致函数识别到的是数据框而非目标向量,因此报错。- 列对象访问错误:
f_act_int是act_means_df数据框中的列,并非全局环境中的独立对象,直接调用class(f_act_int)会找不到对象,必须通过act_means_df$f_act_int访问。
正确解决方案
方案1:按自定义强度顺序排序
如果需要严格按照「sedentary → lightly active → fairly active → very active」的逻辑顺序排序,可以直接在转换因子时指定levels参数:
library(tidyverse) # 构建数据框并指定因子顺序 act_means_df <- data.frame( activity_intensity = c("sedentary", "lightly active", "fairly active", "very active"), intens_means = c(991.2106, 192.8128, 13.56489, 21.16489) ) %>% mutate(activity_intensity = factor(activity_intensity, levels = c("sedentary", "lightly active", "fairly active", "very active"))) # 绘制条形图 ggplot(act_means_df, aes(x = activity_intensity, y = intens_means)) + geom_col(fill = "#f68060", alpha = .6, width = .4) + coord_flip() + xlab("") + theme_bw()
方案2:按数值大小排序
如果需要根据intens_means的数值大小排序,可以在ggplot的aes中直接使用fct_reorder处理向量:
library(tidyverse) act_means_df <- data.frame( activity_intensity = c("sedentary", "lightly active", "fairly active", "very active"), intens_means = c(991.2106, 192.8128, 13.56489, 21.16489) ) # 在绘图时直接重排因子 ggplot(act_means_df, aes(x = fct_reorder(activity_intensity, intens_means), y = intens_means)) + geom_col(fill = "#f68060", alpha = .6, width = .4) + coord_flip() + xlab("") + theme_bw()
方案3:提前在数据框中重排因子
也可以在数据框处理阶段用mutate结合fct_reorder完成排序:
library(tidyverse) act_means_df <- data.frame( activity_intensity = c("sedentary", "lightly active", "fairly active", "very active"), intens_means = c(991.2106, 192.8128, 13.56489, 21.16489) ) %>% mutate(activity_intensity = fct_reorder(activity_intensity, intens_means)) ggplot(act_means_df, aes(x = activity_intensity, y = intens_means)) + geom_col(fill = "#f68060", alpha = .6, width = .4) + coord_flip() + xlab("") + theme_bw()
内容的提问来源于stack exchange,提问作者dr.pas
相关产品推荐
相关产品推荐

