假设我有几个不同迭代的一个变量的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
我想,对于每个“日”,在“日”中垂直运行像素,以表示当天颜色的迭代值的概率密度。结果应该看起来像热图。
答案 0 :(得分:3)
这是我认为你所追求的解决方案之一。
生成数据。
myData <- mapply(rnorm, 1000, 200, mean=seq(-50,50,0.5))
这是一个包含1000行(观察值)和201个时间点的矩阵。在每个时间点,数据的平均值从-50逐渐变为50.每次0.5。
获得密度。
myDensities <- apply(myData, 2, density, from=-500, to=500)
这将为您提供每列的密度列表。为了使它们能够并排绘图,我们手动指定了范围(从-500到500)。
从列表中获取密度值。
Ys <- sapply(myDensities, "[", "y")
这又是一个清单。你需要从中得到一个矩阵。
从列表中获取矩阵。
img <- do.call(cbind, Ys)
这只是按列合并所有Ys
元素。
剧情。
filled.contour(x=1:ncol(img), y=myDensities[[1]]$x, t(img))
我使用的是fill.contour。但是你可以四处寻找其他2-D绘图功能。我还使用了从密度D[[1]]$x
获得的值。
结果如下:
从-50到50的转变是可见的。
不确定这是否适用于数百万个时间点。但绘制百万可能没什么意义,因为在任何情况下你都会受到像素数量的限制。可能需要进行某种预处理。