绘制具有不同日期的数据

时间:2013-06-28 12:09:19

标签: r plot axis

我的数据集图有些麻烦。 这是我的数据集的摘录。

   Date      Month Year  Value 1
30/05/96       May 1996 1835
06/12/96  December 1996 1770
18/03/97     March 1997 1640
27/06/97      June 1997 1379
30/09/97 September 1997 1195
24/11/97  November 1997 1335
13/03/98     March 1998 1790
07/05/98       May 1998  349
14/07/98      July 1998 1179
27/10/98   October 1998  665

我想要做的是每年对着山(x)的价值1(y)的情节。换句话说,一个有3行的图表显示了不同年份每个月值1的变化。

我执行以下操作:

plot(x[Year==1996,4], xaxt="n")
par(new=T)
plot(x[Year==1997,4], xaxt="n")
axis(1, at=1:length(x$Month), labels=x$Month)

问题是1996年的第一个值是指may,而1997年的第一个值是指3月。因此,绘制的值是混合的,不再与它们的月份相对应。 有没有办法在同一个图中绘制所有这些值,保持数据的原始对应关系?

3 个答案:

答案 0 :(得分:3)

df <- read.table(text="Date      Month Year  Value1
30/05/96       May 1996 1835
06/12/96  December 1996 1770
18/03/97     March 1997 1640
27/06/97      June 1997 1379
30/09/97 September 1997 1195
24/11/97  November 1997 1335
13/03/98     March 1998 1790
07/05/98       May 1998  349
14/07/98      July 1998 1179
27/10/98   October 1998  665", header=T, as.is=T)

df$Month <- factor(df$Month, levels=month.name, ordered=T)

library(ggplot2)
ggplot(df) + geom_line(aes(Month, Value1, group=Year)) +
  facet_grid(Year~.)

enter image description here

答案 1 :(得分:2)

为您的月份创建数值:

x$MonthNum <- sapply(x$Month, function(x) which(x==month.name))

然后使用这些数值进行绘图,但用单词标记轴。

plot(NA, xaxt="n", xlab="Month", xlim=c(0,13),
    ylim=c(.96*min(x$Value),1.04*max(x$Value)), type="l")
z <- sapply(1996:1998, function(y) with(x[x$Year==y,], lines(MonthNum, Value1)))
axis(1, at=1:12, labels=month.name)

还有一些标签,如果你想确定年份:

xlabpos <- tapply(x$MonthNum, x$Year, max)
ylabpos <- mapply(function(mon, year) x$Value1[x$MonthNum==mon & x$Year==year],     
    xlabpos, dimnames(xlabpos)[[1]])
text(x=xlabpos+.5, y=ylabpos, labels=dimnames(xlabpos)[[1]])

single plot, multiple lines

还可以使用layout获得与ggplot示例类似的内容:

par(mar=c(2,4,1,1))
layout(matrix(1:3))
z <- sapply(1996:1998, function(y) {
    with(x[x$Year==y,], plot(Value1 ~ MonthNum, xaxt="n", xlab="Month", ylab=y,
        xlim=c(0,13), ylim=c(.96*min(x$Value),1.04*max(x$Value)), type="l"))
    axis(1, at=1:12, labels=month.name)
})

multiple plots

答案 2 :(得分:2)

使用@Michele df的lattice替代方案。我在这里展示了2个替代方案(有和没有分面)

library(lattice)
library(gridExtra)
p1 <- xyplot(Value1~Month,groups=Year,data=df,
       type=c('p','l'),auto.key=list(columns=3,lines=TRUE))
p2 <- xyplot(Value1~Month|Year,groups=Year,data=df,layout= c(1,3),
       type=c('p','l'),auto.key=list(columns=3,lines=TRUE))
grid.arrange(p1,p2)

enter image description here