【问题标题】:Plotting Probability Density Heatmap Over Time in R在 R 中随时间绘制概率密度热图
【发布时间】:2015-08-29 11:58:29
【问题描述】:

假设我有一个变量在多个不同迭代中的蒙特卡罗模拟输出(想想数百万)。对于每次迭代,我都有每个时间点的变量值(范围从 t=1 到 t=365)。

我想制作以下情节: 对于 x 轴上的每个时间点 t 以及给定范围内的每个可能值“y”,将 x,y 的颜色设置为“k”,其中“k”是在 a 内有多少观测值的计数距离“d”到 x,y 的附近。

我知道您可以轻松地为一维数据制作密度热图,但是是否有一个很好的软件包可以在二维上执行此操作?我必须使用克里金法吗?

编辑:数据结构目前是一个矩阵。

                                     data matrix

                                      day number
             [,1]    [,2]         [,3]      [,4]       [,5]      ... [,365]
iteration    [1,]    0.000213   0.001218    0.000151   0.000108  ... 0.000101
             [2,]    0.000314   0.000281    0.000117   0.000103  ... 0.000305
             [3,]    0.000314   0.000281    0.000117   0.000103  ... 0.000305
             [4,]    0.000171   0.000155    0.000141   0.000219  ... 0.000201
              .
              .
              .
     [100000000,]    0.000141   0.000148    0.000144   0.000226  ... 0.000188

我想,对于每个“天”,像素在那个“天”上垂直运行,以用颜色表示该天迭代值的概率密度。结果应该看起来像热图。

【问题讨论】:

  • 试试image函数,或者ggplot2中的geom_tile/geom_raster。
  • @ssdecontrol 如果我要使用图像功能,如何处理我没有数据的 x,y 坐标?我是否必须通过插值自己为绘图构建 x,y 矩阵?我希望有一些东西可以开箱即用地做到这一点......
  • @Alfalfa 缺失数据是任何上下文中的缺失数据。如果你的矩阵中有“洞”,那么你需要处理它们。如果您的意思是您的 x 轴应该不是“1、2、3、4”,那么您可以自己构建轴。
  • @Alfalfa 还有一些例子here
  • @ssdecontrol hexbinplot 似乎非常适合我想做的事情。非常感谢!

标签: r plot time-series heatmap kriging


【解决方案1】:

这是我认为您所追求的一种解决方案。

  1. 生成数据。

    myData <- mapply(rnorm, 1000, 200, mean=seq(-50,50,0.5))

这是一个包含 1000 行(观察)和 201 个时间点的矩阵。在每个时间点,数据的平均值从-50逐渐变化到50。每次0.5。

  1. 获取密度。

    myDensities <- apply(myData, 2, density, from=-500, to=500)

这将为您提供每列的密度列表。为了让它们可以并排绘制,我们手动指定了范围(从 -500 到 500)。

  1. 从列表中获取密度值。

    Ys <- sapply(myDensities, "[", "y")

这又是一个列表。你需要从中得到一个矩阵。

  1. 从列表中获取矩阵。

    img <- do.call(cbind, Ys)

这只是按列组合所有Ys 元素。

  1. 情节。

    filled.contour(x=1:ncol(img), y=myDensities[[1]]$x, t(img))

我为此使用了filled.contour。但是您可以四处寻找其他二维绘图功能。我还使用了从密度D[[1]]$x 获得的值。

结果如下:

从 -50 到 50 的转变是可见的。

不确定这是否适用于数百万个时间点。但是绘制百万可能没有什么意义,因为无论如何您都会受到像素数量的限制。可能需要进行某种预处理。

【讨论】:

  • 幸运的是,我没有数百万个时间点,而只是每个时间点有数百万个观察值。所以这将完美地工作。我将与 cmets 中建议的 hexbinplot 一起尝试。谢谢!
  • 任何时候filled.contour 都是答案然后lattice::levelplot 也是一个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2017-11-30
相关资源
最近更新 更多