我有一个数据集,它绘制了一段时间内的失业情况,我想在经济衰退时添加突出显示的波段。
原始数据帧称为季度数据。
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
有人知道怎么解决这个问题吗?
发布于 2020-04-28 20:17:55
虽然您为我们提供了data frame recession
,但您没有向我们提供data frame quarterly_data
,因为您会收到错误。这里有几点要尝试,但首先,要描述一下是什么导致了这个问题。
首先是time_trans
appears to be from the scales package,但不清楚为什么需要基于上面的代码运行。这里还有其他可以使用scales
包的东西吗?
现在,对于错误消息本身,它只需要一个POSIXct
类的对象。这不同于Date
类的对象,后者是从您正在使用的lubridate
包中创建的,从使用as_date
创建recession
数据框可以明显看出这一点。
您可以通过运行class(recession$date_start)
来确认这一点,您可以在其中看到输出是一个Date
类对象。
在ymd()
函数之后,您还将获得一个Date
类的对象。From the documentation,您应该能够通过提供一个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()
。我建议使用以下顺序:
ymd()
函数,但提供tz="GMT"
以强制输出为POSIXct对象。不确定这是否会successful.ggplot()
行本身。你会得到同样的错误吗?如果是,则错误出现在quarterly_data
数据帧中,而不是recession
数据帧中。如果它可以工作,那么运行ggplot()
行并添加geom_line()
对象。如果它仍然有效,那么您的问题出在geom_rect
函数上,这很可能意味着recession
数据框。quarterly_data
中的date对象类。它们是Date
类还是POSIXct
类?如果是Date
,请尝试将它们转换为POSIXct
(也许只需使用as.POSIXct()
).coord_flip()
或任何scale_x
或其他主题元素,则它们肯定会尝试调整时间刻度并导致该错误。https://stackoverflow.com/questions/61485142
复制相似问题