我正在尝试制作一个栅格图(如hovmoller图)并希望有人可以提供帮助。我看过rasterVis和其他一些人的帮助,但似乎无法得到他们的例子来适应我的数据,这可能需要以某种方式改变我的想法。我已设法创建绘图,但单元格的填充值与原始数据不对应。我复制了一个我的数据框示例的dput()文件(希望这是正确的方法)。我想要的是沿x轴的一年中的几天(DOY),每个DOY上方的y轴为48个矩形(DF中的小时列)。这些矩形代表每个DOY的半小时间隔,并根据它们相应的值(DF中的qc列)进行着色,即0,1或2
到目前为止,我已经提出了以下代码,但是对于颜色分配z值(qc列)似乎存在问题,我认为这些值由于某种原因没有正确排列。
mcol <- c("green","blue","red")
x=unique(DF[,"DOY"])
y=unique(DF[,"hour"])
z=matrix(DF[,"qc"],nrow=length(unique(DF[,"DOY"])),
ncol=length(unique(DF[,"hour"])))
image(x,y,z, col=mcol,
xlab="Day of Year 2012",
ylab="Hour of day",
main="Hovmoller plot of 2012 qc flags",
useRaster=TRUE)
似乎正在发生的是填充值矩阵(z)首先沿着x轴的底部(从左到右)运行然后循环到顶部,而我需要它从左下角开始然后上升然后从左到右循环(希望这有点意义!) 我的示例数据仅涵盖三天,但完整数据集将为整整一年(2012年为366)。 在此先感谢您的帮助,
乔恩
structure(list(DOY = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
6L, 6L, 6L, 6L, 6L, 6L), hour = c(0.5, 1, 1.5, 2, 2.5, 3, 3.5,
4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11,
11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5,
18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24,
0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5,
8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5,
15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21,
21.5, 22, 22.5, 23, 23.5, 24, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4,
4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5,
12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18,
18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24),
qc = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 1L, 2L, 1L, 1L, 2L, 2L, 0L, 0L, 1L, 0L, 2L, 2L, 2L, 2L,
2L, 2L, 0L, 2L, 2L, 0L, 0L, 1L, 2L, 0L, 2L, 0L, 1L, 2L, 1L,
2L, 2L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 0L, 0L,
2L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L)), .Names = c("DOY",
"hour", "qc"), class = "data.frame", row.names = c(NA, -144L))
答案 0 :(得分:4)
关闭!尝试这样的事情(x和y由上面的代码生成):
library( sp )
r <- raster(nrows=length(y), ncols=length(x), xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y))
values(r) <- t(DF$qc)
spplot( r , cuts = 2 )
包spplot
中的 sp
使用点阵图形,可根据您的需求进行定制
好的,geom_tile
可能是一个更好的选择(直到栅格细胞的数量变大),如果你想能够识别不同的细胞:
p <- ggplot( DF , aes(factor(DOY), hour ) ) +
geom_tile( aes(fill = factor(qc) ) , color = "#D9D9D9" ) +
scale_fill_brewer(name="QC", type = "div" , palette = "RdBu" )+
scale_x_discrete( name = "Day" , expand = c(0,0) ) +
scale_y_continuous( name = "Hour" , limits = c(0.5,24) , expand = c(0,0) , breaks = seq(0,24,2) )+
coord_equal()
print(p)
答案 1 :(得分:3)
现在确定了这个问题,而且也很简单......
library(ggplot2)
ggplot(DF,aes(DOY,hour,fill=qc))+geom_raster()
抱歉,这比我想象的要简单得多。我更喜欢传奇色彩是离散的而不是连续的,但它是一个小细节。感谢您的输入。 乔恩
答案 2 :(得分:0)
设计了hovmoller
包中的rasterVis
函数
对于4D数据(坐标,数字变量和时间
指数)。但是,如果我没有错,你需要绘制一个单变量
使用等级图的时间序列。
这里我展示了lattice::levelplot
的示例。
首先,我们使用时间索引定义数据:
tt <- seq(as.POSIXct('2013-01-01'), by='hour', length=8760)
vals <- 1:24 - 12.5
myDF <- data.frame(vals, tt)
接下来,我们定义两个辅助函数来提取小时和天 年份从时间索引:
hour <- function(x)as.numeric(format(x, '%H'))
DoY <- function(x)as.numeric(format(x, '%j'))
然后,我们加载包并用顺序定义主题
来自RColorBrewer
包的调色板:
library(lattice)
library(latticeExtra)
myTheme <- custom.theme(region=brewer.pal(n=10, 'RdBu'))
最后,我们准备显示数据:
levelplot(vals ~ DoY(tt)*hour(tt),
data=myDF,
xlab='Day', ylab='Hour',
par.settings=myTheme)
要获得更完整的解决方案,您可能会对此感兴趣
strip
function
的
metvurst
package