在时间图上动态设置X限制

时间:2014-07-14 20:40:18

标签: r plot time-series

我想知道如何动态设置包含两个具有不同日期的时间序列的时间序列图的x轴限制。我开发了以下代码,以提供可重现的问题示例。

#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")

我在上面的代码中看到的主要问题是图上有两个不同的x轴,一个用于Data1,另一个用于Data2。我希望有一个x轴跨越由Data1和Data2中的日期确定的日期范围。

我的问题是:

如何为两个系列动态创建x轴? (即从数据框中选择最小和最大日期&#39; Data1&#39;和&#39; Data2&#39;)

1 个答案:

答案 0 :(得分:1)

解决方案是将数据合并为一个data.frame,并将x轴基于该数据。这种方法适用于ggplot2绘图包。首先,我们合并数据并添加一个ID列,该列指定它所属的数据集。我在这里用字母:

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

然后使用ggplot2创建绘图,其中颜色表示它所属的数据集(可以很容易地更改为不同的颜色):

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

enter image description here

请注意,您在此处获得一个统一的x轴。在这种情况下,这很好,但如果时间序列不重叠,这可能会有问题。在这种情况下,我们可以使用多个子图,在ggplot2中称为构面:

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

enter image description here

现在每个方面都有自己的x轴,即每个子数据集一个。什么方法最有效取决于具体情况。