【问题标题】:Producing a raster plot in R在 R 中生成栅格图
【发布时间】:2013-02-17 11:49:22
【问题描述】:

我正在尝试生成栅格图(如 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))

【问题讨论】:

  • 类似library(raster);plot(raster(t(z)))?

标签: r plot raster raster-graphics


【解决方案1】:

设计了rasterVis 包中的hovmoller 函数 对于 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 functionmetvurst package.

【讨论】:

    【解决方案2】:

    关闭!尝试这样的事情(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)
    

    【讨论】:

    • 感谢您的回复,但由于 qc 值与单元格未对齐而遇到同样的问题。作为测试,如果将与 DOY4 对应的所有 qc 值更改为 1,则图左侧应该有一条从 ymin 到 ymax 的垂直白线,这不会发生。不知何故,z 值的矩阵没有朝着正确的方向运行。
    • 谢谢西蒙,是的,我确实想辨别单个细胞,所以您的解决方案是理想的,非常感谢。
    • @JonP 好的,太好了!您现在应该勾选您或我的答案旁边的绿色箭头,表明这已经回答了您的问题。
    【解决方案3】:

    好的,现在解决了,而且也很简单......

    library(ggplot2)
    ggplot(DF,aes(DOY,hour,fill=qc))+geom_raster()
    

    抱歉,这比我想象的要简单得多。我希望图例颜色是离散的而不是连续的,但这是一个小细节。感谢您的输入。 乔恩

    【讨论】:

    • ++ 在这个线程中既能交流又能提供信息。希望在 R 社区中见到更多人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多