使用ggplot绘制速度时间序列棒图触发date_trans报错如何解决
问题排查与修正
你代码的报错来自以下几处核心错误:
- 定义
Date向量时没有加引号,R会将2016-08-01识别为数值减法运算,最终得到的是数字而非日期值 - 日期转换逻辑不符合语法要求:
DF$Date <- as.Date(1,as.Date(DF$Date,origin = "2016-08-04"))这行写法错误,导致最终DF$Date不是合法的Date类对象,直接触发你看到的报错 geom_rect中xmin的日期字符串写错,年份少写了数字2,016-08-04是不合法的日期值xend计算时使用dhours生成的时长加在Date类型上会导致类型不匹配,需要统一坐标类型
修正后可直接运行的完整代码
# 加载依赖包 library(ggplot2) library(lubridate) library(scales) Speed <-c(24,23,23,24,26,27,27,27,26,24) Dir <- c(108,105,103,100,97,96,97,99,101,103) # 修正:日期字符串加引号 Date <-c("2016-08-01","2016-08-02","2016-08-03","2016-08-04","2016-08-05","2016-08-06","2016-09-07","2016-09-08","2016-09-09","2016-09-10") DF <-data.frame(Speed,Dir,Date) # 修正:正确转换日期格式 DF$Date <- as.Date(DF$Date, format = "%Y-%m-%d") ggplot(DF) + geom_segment(aes(x = Date, y = 0, # 修正:将小时偏移转为天数偏移,保持Date类型一致 xend = Date + (Speed * 1 * -cos((90-Dir) / 360 * 2 * pi))/24, yend = Speed * 1 * -sin((90-Dir) / 360 * 2 * pi), col = factor(Date) ), arrow = arrow(length = unit(0.5, "cm")) ) + geom_point(aes(Date, 0), size = 1) + scale_x_date(labels = date_format('%b'), breaks = date_breaks('1 month'))+ coord_fixed(3600) + theme(legend.position = "none")+ # 修正:补全年份,增加透明度避免遮挡底层元素 geom_rect(aes(xmin = as.Date("2016-08-04", "%Y-%m-%d"), xmax = as.Date("2016-09-18", "%Y-%m-%d"),ymin = -Inf,ymax = Inf), alpha = 0.1)
内容的提问来源于stack exchange,提问作者okscientist
相关产品推荐
相关产品推荐

