dubbbdan
dubbbdan

Reputation: 2720

Dynamically Set X limits on time plot

I am wondering how to dynamically set the x axis limits of a time series plot containing two time series with different dates. I have developed the following code to provide a reproducible example of my problem.

#Dummy Data
Data1 <- data.frame(Date = c("4/24/1995","6/23/1995","2/12/1996","4/14/1997","9/13/1998"), Area_2D = c(20,11,5,25,50))
Data2 <- data.frame(Date = c("6/23/1995","4/14/1996","11/3/1997","11/6/1997","4/15/1998"), Area_2D = c(13,15,18,25,19))
Data3 <- data.frame(Date = c("4/24/1995","6/23/1995","2/12/1996","4/14/1996","9/13/1998"), Area_2D = c(20,25,28,30,35))
Data4 <- data.frame(Date = c("6/23/1995","4/14/1996","11/3/1997","11/6/1997","4/15/1998"), Area_2D = c(13,15,18,25,19))

#Convert date column as date
Data1$Date <- as.Date(Data1$Date,"%m/%d/%Y")
Data2$Date <- as.Date(Data2$Date,"%m/%d/%Y")
Data3$Date <- as.Date(Data3$Date,"%m/%d/%Y")
Data4$Date <- as.Date(Data4$Date,"%m/%d/%Y")

#PLOT THE DATA
max_y1 <- max(Data1$Area_2D)

# Define colors to be used for cars, trucks, suvs
plot_colors <- c("blue","red")

plot(Data1$Date,Data1$Area_2D, col=plot_colors[1], 
     ylim=c(0,max_y1), xlim=c(min_x1,max_x1),pch=16, xlab="Date",ylab="Area", type="o")
par(new=T)
plot(Data2$Date,Data2$Area_2D, col=plot_colors[2], 
     ylim=c(0,max_y1), xlim=c(min_x1,max_x1),pch=16, xlab="Date",ylab="Area", type="o")

The main problem I see with the code above is there are two different x axis on the plot, one for Data1 and another for Data2. I want to have a single x axis spanning the date range determined by the dates in Data1 and Data2.

My questions is:

How do i dynamically create an x axis for both series? (i.e select the minimum and maximum date from the data frames 'Data1' and 'Data2')

Upvotes: 1

Views: 585

Answers (1)

Paul Hiemstra
Paul Hiemstra

Reputation: 60924

The solution is to combine the data into one data.frame, and base the x-axis on that. This approach works very well with the ggplot2 plotting package. First we merge the data and add an ID column, which specifies to which dataset it belongs. I use letters here:

Data1$ID = 'A'
Data2$ID = 'B'
merged_data = rbind(Data1, Data2)

And then create the plot using ggplot2, where the color denotes which dataset it belongs to (can easily be changed to different colors):

library(ggplot2)
ggplot(merged_data, aes(x = Date, y = Area_2D, color = ID)) + 
    geom_point() + geom_line()

enter image description here

Note that you get one uniform x-axis here. In this case this is fine, but if the timeseries do not overlap, this might be problematic. In that case we can use multiple sub-plots, known as facets in ggplot2:

ggplot(merged_data, aes(x = Date, y = Area_2D)) + 
    geom_point() + geom_line() + facet_wrap(~ ID, scales = 'free_x')

enter image description here

Now each facet has it's own x-axis, i.e. one for each sub-dataset. What approach is most valid depends on the specific situation.

Upvotes: 1

Related Questions