ggplot2绘制按Values排序的日期/时间柱状图报错求助
解决ggplot绘制排序柱状图时的
origin must be supplied错误 看起来你在使用ggplot绘制排序柱状图时遇到了一个典型的语法+数据类型问题,我来帮你拆解并解决它:
问题回顾
你有如下的R数据框df:
df <- data.frame( Date = rep("2018-04-02", 6), Time = c("09:15:00", "09:30:00", "09:45:00", "10:00:00", "10:15:00", "10:30:00"), Values = c(14.00000, 4.00000, 20.00000, 30.00000, 14.00000, 31.16667) )
你需要绘制两幅柱状图:
- 一幅以
Date为X轴,按Values字段排序 - 另一幅以
Time为X轴,按Values字段排序
你尝试了这段代码(以Time为X轴):
ggplot(df, aes(reorder(Time, Values)), y=Values) + geom_col(position = "dodge")
但触发了错误:
Error in as.Date.numeric(value) : 'origin' must be supplied
问题根源
这个错误有两个核心原因:
- 语法错误:你把
y=Values放在了aes()函数的外面,ggplot无法正确识别y轴的映射关系; - 数据类型冲突:如果你的
Date或Time列是日期/时间类型(而非字符型),reorder()函数在处理时会自动将其转换为数值格式,但日期类型转数值需要指定origin参数,这就导致了报错。
修复后的完整代码
1. 以Time为X轴,按Values排序的柱状图
这里推荐两种方法,都能解决问题:
# 方法1:修正aes语法,直接使用reorder(适用于Time为字符型的情况) ggplot(df, aes(x = reorder(Time, Values), y = Values)) + geom_col(position = "dodge") + labs(x = "Time") # 方法2:使用forcats包的fct_reorder(更直观,兼容更多数据类型) library(forcats) ggplot(df, aes(x = fct_reorder(Time, Values), y = Values)) + geom_col(position = "dodge") + labs(x = "Time")
2. 以Date为X轴,按Values排序的柱状图
虽然你的数据里Date都是同一天,排序后视觉变化不大,但如果后续有多个日期,同样可以用类似方法:
# 基础修正版 ggplot(df, aes(x = reorder(Date, Values), y = Values)) + geom_col(position = "dodge") + labs(x = "Date") # 兼容Date类型的版本(如果Date列是Date格式) df$Date <- as.Date(df$Date) ggplot(df, aes(x = factor(reorder(Date, Values)), y = Values)) + geom_col(position = "dodge") + labs(x = "Date")
额外提示
如果想要按Values降序排序,只需要在reorder或fct_reorder里给Values加个负号即可,比如reorder(Time, -Values)或者fct_reorder(Time, -Values)。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

