在R中绘制概率密度热图随时间的变化

时间:2015-06-13 15:52:50

标签: r plot time-series heatmap kriging

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

我想制作以下图: 对于x轴上的每个时间点t,对于给定范围内的每个可能值“y”,将x,y的颜色设置为“k”,其中“k”是a中观察数量的计数。距离“d”到x,y的距离。

我知道您可以轻松地为1D数据制作密度热图,但是在2维上有这么好的包吗?我必须使用克里金吗?

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

                                     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

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

1 个答案:

答案 0 :(得分:3)

这是我认为你所追求的解决方案之一。

  1. 生成数据。

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

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

    1. 获得密度。

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

    2. 这将为您提供每列的密度列表。为了使它们能够并排绘图,我们手动指定了范围(从-500到500)。

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

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

      2. 这又是一个清单。你需要从中得到一个矩阵。

        1. 从列表中获取矩阵。

          img <- do.call(cbind, Ys)

        2. 这只是按列合并所有Ys元素。

          1. 剧情。

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

          2. 我使用的是fill.contour。但是你可以四处寻找其他2-D绘图功能。我还使用了从密度D[[1]]$x获得的值。

            结果如下:

            densities

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

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