使用ggplot绘制柱状图出现abs(x)非数值参数错误如何解决
问题排查与修复方案
错误根因
- 核心问题:使用
lapply()处理df$date列后,返回结果为列表类型,而非ggplot可识别的字符/因子向量,ggplot在统计柱状图分组计数时,无法对列表类型变量执行数学运算,直接触发非数值参数报错 - 衍生问题:
date_abbreviator()函数的输入是字符串格式的日期值,不是R内置的Date类型,直接调用strftime()会解析失败,导致最终输出的date列值异常
修复后的完整代码
library(ggplot2) library(dplyr) library(stringr) adder_dd_with_yyyy_mm <- function(date) { if(str_count(date, "-") == 1) { return(paste(date, "01", sep = "-")) } else { return(date) } } date_abbreviator <- function(date_str) { # 先将字符串转换为Date类型再执行格式化 date_obj <- as.Date(date_str) month <- strftime(date_obj, format = "%b") year <- strftime(date_obj, format = "%y") return(paste(month, year, sep = "-")) } df <- read.csv("figure_metadata.tsv", sep = "\t") # 用sapply代替lapply返回向量,同时转成因子保证时间排序正确 df$date <- df$date %>% sapply(adder_dd_with_yyyy_mm) %>% sapply(date_abbreviator) %>% factor(levels = unique(.)) ggplot(data = df) + geom_bar(mapping = aes(x = date, fill = clade))
验证方法
执行代码后如果仍有异常,可运行str(df$date)检查列类型,确认输出为Factor或chr类型、而非list即可。
内容的提问来源于stack exchange,提问作者Rajan Raju
相关产品推荐
相关产品推荐

