我试图在此图表中为我的x轴添加刻度以显示一年中的所有月份:
我的代码如下:
library(ggplot2)
library(scales)
p <- ggplot(df_test, aes(time, reading))
p + geom_point(alpha = 1/4) + geom_smooth()
我尝试使用scale_x_date,但遇到了以下错误:
Error: Invalid input: date_trans works with objects of class Date only
这是我使用的数据框:
hour reading date time
1 53 1/1/15 2015-01-01 01:00:00
2 55 1/1/15 2015-01-01 02:00:00
3 56 1/1/15 2015-01-01 03:00:00
我的时间变量类:
类(df_test $时间) &#34; POSIXct&#34; &#34; POSIXt&#34;
答案 0 :(得分:4)
您正尝试在Date
对象上使用特定于POSIXct
的比例。解决方案是使用POSIXct
将date
对象转换为as.date
:
> Sys.time()
[1] "2015-09-16 09:52:42 CEST"
> as.Date(Sys.time())
[1] "2015-09-16"
要在data.frame
上执行此操作,建议您使用dplyr
包:
df_test = df_test %>% mutate(time = as.Date(time))
答案 1 :(得分:3)
使用scale_x_date(breaks="month", labels=date_format("%b%))
。这是一个例子。
library(quantmod)
sp500 <- getSymbols("SP500", src="FRED", auto.assign=FALSE)
sp500 <- sp500["2015-01-01::"]
sp500 <- data.frame(time=as.POSIXct(index(sp500), origin="1970-01-01"),sp500)
class(sp500$time)
# [1] "POSIXct" "POSIXt"
library(ggplot2)
library(scales) # for date_format(...)
ggplot(sp500, aes(x=as.Date(time), y=SP500))+
geom_line()+
scale_x_date(breaks="month", labels=date_format("%b"))
答案 2 :(得分:2)
结合@PaulHiemstra和@jihoward的答案,我找到了答案。
首先使用dplyr库重新编写数据:
library(dplyr)
df_test1 = df_test %>% mutate(time = as.Date(time))
然后使用scale_x_dates:
library(ggplot2)
library(scales)
p <- ggplot(df_test1, aes(time, reading))
p + geom_point(alpha = 1/4)+
scale_x_date(breaks="month", labels=date_format("%b"))
给出结果:
答案 3 :(得分:0)
由于最近的答案 (2015) date_format()
已被弃用(我相信)。将其替换为 label_date()
或 scales::label_date()
。它可能未加载到您的命名空间中,但应与 ggplot 一起提供,因此可能需要 scales::
。
这是@timothylim 接受的答案的复制和粘贴,并进行了更改。
library(dplyr)
df_test1 = df_test %>% mutate(time = as.Date(time))
library(ggplot2)
library(scales)
p <- ggplot(df_test1, aes(time, reading))
p + geom_point(alpha = 1/4)+
scale_x_date(breaks="month", labels = scales::label_date("%b"))