我有一个数据集,它绘制了失业率随时间的变化,我想添加突出显示经济衰退时的带。
原始数据帧称为季度数据。
recession <- data.frame(date_start= as_date(c("1973-07-01", "1980-01-01", "1990-07-01","2008-04-01")),
date_end = as_date(c("1975-07-01","1981-04-01", "1991-07-01","2009-04-01")))
recession$date_start <- ymd (recession$date_start)
recession$date_end <- ymd (recession$date_end)
ggplot(quarterly_data, aes(x=date, y= Unemployment))+
geom_line()+
geom_rect(data = recession, inherit.aes=FALSE , aes(xmin = date_start, xmax = date_end, ymin = -0.1, ymax = 0.1),
fill = "red", alpha= 0.3)
然而,当我运行ggplot时,我会收到以下错误消息:
Error: Invalid input: time_trans works with objects of class POSIXct only
有人知道怎么解决这个问题吗?
虽然您向我们提供了数据帧recession
,但您没有向我们提供数据帧quarterly_data
,在那里您会得到错误。这里有一些建议可以尝试,但首先,对造成这个问题的原因进行一些描述。
首先,time_trans
似乎来自scales包,但不清楚为什么需要基于上面的代码运行。这里还有什么可以使用scales
包的东西吗?
现在,对于错误消息本身,它只需要POSIXct
类的对象。这与Date
类的对象不同,后者是从您正在使用的lubridate
包中创建的,从使用as_date
创建recession
数据帧可以明显看出。
您可以通过运行class(recession$date_start)
自己确认这一点,在那里您可以看到输出是一个Date
类对象。
在ymd()
函数之后,您还将获得一个类为Date
的对象。从文档中,您应该能够通过提供tz=
(时区(参数来强制将类转换为POSIXct
POSIXt
。您可以通过以下内容看到这一点:
> class(ymd(recession$date_start))
[1] "Date"
> class(ymd(recession$date_start, tz='GMT'))
[1] "POSIXct" "POSIXt"
所以,这可能会解决你的问题。但是,您还有一些侦探工作要做,因为我们没有您的其他数据帧,而且我们显然没有看到试图从scales
包调用time_trans
的函数。这里的另一种可能性是ggplot
调用它来调整基于POSIXt对象的轴。。。但我没有看到可能导致此错误的scale_
调用或coord_flip()
。我推荐以下顺序:
尝试"homerun"方法,再次运行
ymd()
函数,但提供tz="GMT"
以强制输出为POSIXct对象。不确定这是否会成功。运行
ggplot()
线路本身。你有同样的错误吗?如果是,则错误位于quarterly_data
数据帧内,而不是recession
数据帧内。如果有效,则运行ggplot()
行并添加geom_line()
对象。如果它仍然有效,那么问题在于geom_rect
函数,这可能意味着recession
数据帧。检查
quarterly_data
中日期对象的类别。它们是Date
类还是POSIXct
类?如果是Date
,请尝试将它们转换为POSIXct
(可能只使用as.POSIXct()
(。你的绘图调用中还有更多属于这里的代码吗?如果您在绘图代码中添加了
coord_flip()
或任何scale_x
或其他主题元素,他们肯定会试图调整时间刻度,从而导致错误。