3

我正在尝试开发一个天气数据中出现的天气图 - 类似的东西。

在此处输入图像描述

我想绘制每日价值(尽管平均值可以出现在圆圈中)。我正在使用 ggplot2,因为它需要多方面的(每个月和每年)。

st <- as.Date ("2009-1-1")
en <- as.Date ("2011-12-28")
date1 <- seq(st, en, "1 day")
year <- format(date1, "%Y")
month <- format (date1, "%b")
day <- as.numeric (format(date1, "%d"))

avgtm <- round (rnorm (length(date1), 50,5), 1)
maxtm <- avgtm + abs(rnorm (length (avgtm), 0, 5))
mintm <-  avgtm - abs(rnorm (length (avgtm), 0, 5))

myd <- data.frame ( year, month, day, avgtm, maxtm, mintm)
require(ggplot2)
qplot(day, avgtm, data = myd, geom = "line", col = "red") +
facet_grid(year ~ month) + theme_bw()

在此处输入图像描述

这里有一个主要问题,线路将在几个月之间连接。

每个月都绘制到最大值(尽管一个月可以以 28 结束,该月留空)。 在此处输入图像描述

有没有一种聪明的方法来实现我想要实现的目标。我试过 ggplot2 但可能还有其他不错的选择。

编辑:

我试图在每月的第一天添加垂直线来区分月份。这是我试图找到一个月的第一天:

 td = as.Date (seq(as.Date("2009/1/1"), as.Date("2011/12/28"), "months"))

我试图用它来绘制线:

qplot(date, avgtm, data = myd, geom = "line", col = "red") +
  facet_wrap(~year, scales='free_x', ncol=1, nrow=3) +

   geom_vline(xintercept=td, linetype="dotted") + theme_bw()

但是运行报错:Error : Invalid intercept type: should be a numeric vector, a function, or a name of a function

如何绘制带有日期的垂直线?

4

2 回答 2

4

制作一个日期列怎么样,然后只在年份分面

myd$date <- as.Date(paste(myd$year, myd$month, myd$day), format='%Y %b %d')

qplot(date, avgtm, data = myd, geom = "line", col = "red") +
  facet_wrap(~year, scales='free_x', ncol=1, nrow=3)

在此处输入图像描述

您也可以添加scales='free_x'到您的情节中,但会发现它使解释变得困难。

通过对月份和年份进行分面,您可以告诉查看者和绘图工具,绘制的变量不是连续的。正如您在问题中指出的那样,这是不正确的。因此,没有刻面...您可以根据需要为每个月或每天添加刻度线。

library(scales)
qplot(date, avgtm, data = myd, geom = "line", col = "red") +
      facet_wrap(~year, scales='free_x', ncol=1, nrow=3) +
      scale_x_date(breaks=date_breaks("month"), labels=date_format("%b"))

或者,您可以在一个图上提取day of year和绘制所有内容,按年份着色:

myd$doy <- format(myd$date, '%j')
p <- ggplot(myd, aes(x=doy, y=avgtm, color=year, group=year))

p + geom_line()

或者

p + geom_smooth()
于 2013-04-17T17:48:18.347 回答
4

有一个解决方案 panel.xblocksfrom latticeExtra

st <- as.Date("2009-1-1")
en <- as.Date("2011-12-28")
date1 <- seq(st, en, "1 day")

avgtm <- round (rnorm (length(date1), 50,5), 1)

myd <- data.frame(date1, avgtm)

我定义了两个函数来提取月份和年份值,而不是将它们包含在data.frame. panel.xblocks这种方法在以下panel功能中很有用 xyplot

month <- function(x)format(x, '%m')
year <- function(x)format(x, '%Y')

year(date1)用作条件变量来生成三个面板。这些面板中的每一个都将显示该年的时间序列 ( panel.xyplot) 和一系列以交替颜色突出显示月份 ( ) 的连续块panel.xblocks。您应该注意,y参数 inpanel.xblocksmonth先前定义的函数:

xyplot(avgtm ~ date1 | year(date1), data=myd,
       type='l', layout=c(1, 3),
       scales=list(x=list(relation='free')),
       xlab='', ylab='',
       panel=function(x, y, ...){
           panel.xblocks(x, month,
                         col = c("lightgray", "white"),
                         border = "darkgray")
           panel.xyplot(x, y, lwd = 1, col='black', ...)
           })

块

于 2013-04-18T21:19:00.327 回答