与ggplot一起绘制日期以绘制框图

时间:2018-04-02 15:56:19

标签: r ggplot2 scale boxplot

我有以下数据框 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"

我看论坛,但我无法弄清楚问题出在哪里,因为对我而言,我已经说过月份是一个约会。

感谢您的帮助!

2 个答案:

答案 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()

enter image description here

数据:与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)