Elia
Elia

Reputation: 17

Issue to have correct scale with date ggplot

I have two dataframes tur_e and tur_w. Below you can see the data frame: tur_e:

               Time_f turbidity_E
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

tur_w:

                 Time_f turbidity_w
 47 2015-06-04 11:45:00         8.4
 48 2015-06-04 12:00:00        10.5
 49 2015-06-04 12:15:00         9.2
 50 2015-06-04 12:30:00         9.1
 51 2015-06-04 12:45:00         8.7
 52 2015-06-04 13:00:00         8.4

I then create a unique dataframe combining turbidity_E and turbidity_w. I match with the date (time_f) and use melt to reshape data:

dplr <- left_join(tur_e, tur_w, by=c("Time_f"))
dt.df <- melt(dplr, measure.vars = c("turbidity_E", "turbidity_w"))

I plotted series of box plot over time. The code is below:

  dt.df%>% mutate(Time_f = ymd_hms(Time_f)) %>% 
  ggplot(aes(x = cut(Time_f, breaks="month"), y = value)) +
  geom_boxplot(outlier.size = 0.3) + facet_wrap(~variable, ncol=1)+labs(x  = "time") 

I obtain the following graph:

plot

I would like to reduce the number of dates that appear in my x-axis. I add this line of code:

scale_x_date(breaks = date_breaks("6 months"),labels = date_format("%b"))

I got this following error:

Error: Invalid input: date_trans works with objects of class Date 
only

I tried a lot of different solutions but no one work. Any help would be appreciate! Thanks!

Upvotes: 0

Views: 132

Answers (1)

Axeman
Axeman

Reputation: 35187

Two things. First, you need to use scale_x_datetime (you don't have only dates, but also time!). Secondly, when you cut x, it actually just becomes a factor, losing any sense of time altogether. If you want a boxplot of each month, you can group by that cut instead:

dt.df %>% mutate(Time_f = lubridate::ymd_hms(Time_f)) %>% 
  ggplot(aes(x = Time_f, y = value, group = cut(Time_f, breaks="month"))) +
  geom_boxplot(outlier.size = 0.3) + 
  facet_wrap(~variable, ncol = 1) + 
  labs(x = "time") +
  scale_x_datetime(date_breaks = '1 month')

Upvotes: 2

Related Questions