在 r 中绘制每月和每年的天气数据

SHR*_*ram 3 plot r ggplot2 lattice

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

在此输入图像描述

我想绘制每日价值(尽管平均值可以出现在圆圈中)。我使用 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

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

编辑:

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

 td = as.Date (seq(as.Date("2009/1/1"), as.Date("2011/12/28"), "months"))
Run Code Online (Sandbox Code Playgroud)

我尝试用它来绘制线:

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()
Run Code Online (Sandbox Code Playgroud)

但是运行报错:Error : Invalid拦截类型: 应该是一个数值向量,一个函数,或者一个函数的名称

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

Osc*_*ñán 5

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)
Run Code Online (Sandbox Code Playgroud)

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

month <- function(x)format(x, '%m')
year <- function(x)format(x, '%Y')
Run Code Online (Sandbox Code Playgroud)

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

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', ...)
           })
Run Code Online (Sandbox Code Playgroud)

x块