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拦截类型: 应该是一个数值向量,一个函数,或者一个函数的名称
如何绘制带有日期的垂直线?
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)
