我有以下数据框 d :
TS Turbidity
1 2014-12-12 00:00:00 87
2 2014-12-12 00:15:00 87
3 2014-12-12 00:30:00 91
4 2014-12-12 00:45:00 84
5 2014-12-12 01:00:00 92
6 2014-12-12 01:15:00 89
TS是我结合年,月,日,小时,分钟和秒的时间。当我查看数据的性质时,TS是:
$ TS : POSIXct, format: "2014-12-12 00:00:00" "2014-12-12 00:15:00"
所以对我来说,R明白TS是日期格式。
我想每月创建一个boxplot(我确切地知道我有几年的数据)。我创建了一个新的列Month,如下所示:
d$Month<-as.Date(cut(d$TS, breaks="month"))
然后我绘制了这个函数:
ggplot(d, aes(x = factor(Month), y = Turbidity))+ geom_boxplot() + theme_bw()
这个函数很好地绘制了我的数据,但是我有太多的x标签,并且想要每4个月绘制一次标签。我添加了scale_x_date:
ggplot(d, aes(x = factor(Month), y = Turbidity))+ geom_boxplot() + theme_bw() +
scale_x_date(date_breaks = "4 month", date_labels = "%B")
正是在这一步我遇到了麻烦。我收到此错误消息:
" Error: Invalid input: date_trans works with objects of class Date only".
但是R确切地说月份是日期格式。
$ Month : Date, format: "2014-12-01" "2014-12-01" "2014-12-01"
我看论坛,但我无法弄清楚问题出在哪里,因为对我而言,我已经说过月份是一个约会。
感谢您的帮助!
答案 0 :(得分:0)
在您对ggplot的调用中,您在内部明确地将BY
转换为Month
的因子。尝试从aes(x = factor(Month))
删除factor()
包装。
这不会改变ggplot之外的对象,这就是为什么当你检查它时它仍然看到它的类是Date。但是你肯定会把这个类从Date转换为ggplot中的Factor。
答案 1 :(得分:0)
一种方法可以是(修改后的数据):
library(ggplot2)
library(lubridate)
df %>% mutate(TS = ymd_hms(TS)) %>%
ggplot(aes(x = cut(TS, breaks="quarter"), y = Turbidity)) +
geom_boxplot() +
labs(x = "Start date of Quarter") +
theme_bw()
数据:与OP不同
df <- read.table(text =
"TS Turbidity
'2014-09-12 00:00:00' 87
'2014-09-12 00:15:00' 107
'2014-10-12 00:30:00' 91
'2014-10-12 00:30:00' 50
'2014-11-12 00:45:00' 84
'2014-11-12 00:45:00' 60
'2014-12-12 01:00:00' 92
'2014-12-12 01:15:00' 60
'2015-01-12 00:00:00' 87
'2015-01-12 00:15:00' 107
'2015-02-12 00:30:00' 91
'2015-02-12 00:30:00' 50
'2015-03-12 00:45:00' 84
'2015-03-12 00:45:00' 60
'2015-04-12 01:00:00' 92
'2015-04-12 01:15:00' 60
'2015-05-12 00:00:00' 87
'2015-05-12 00:15:00' 107
'2015-06-12 00:30:00' 91
'2015-06-12 00:30:00' 50
'2015-07-12 00:45:00' 84
'2015-07-12 00:45:00' 60
'2015-08-12 01:00:00' 92
'2015-08-12 01:15:00' 60", header = TRUE, stringsAsFactors = FALSE)