R plot 'Heat map' of set of draws

R plot 'Heat map' of set of draws

我有一个包含 x 行(即抽取次数)和 y 列(观察次数)的矩阵。它们代表 y 预测的分布。

现在我想做一个 'heat map' 的抽奖。也就是说,我想绘制一个 'confidence interval' (不是真正的置信区间,而是所有带有阴影的值),但作为 'heat map' ( heat map 的示例) .这意味着,例如,如果用于观察 y=y* 的很多平局都在 1 左右,但对于同一观察也有 5 平局,那么 1 附近的置信区间区域更暗(但整体是1 到 5 之间仍然有阴影。

完全清楚:例如,我喜欢答案 here 中的情节,但我希望灰色置信区间改为着色为强度(即某些区域更暗)。

有人可以告诉我如何实现吗?

提前致谢。

编辑: 根据要求:示例数据。 第一列的前 20 个值的示例(即 y[1:20,1]):

[1]  0.032067416 -0.064797792  0.035022338  0.016347263  0.034373065 
0.024793101 -0.002514447  0.091411355 -0.064263536 -0.026808208 [11]  0.125831185 -0.039428744  0.017156454 -0.061574540 -0.074207109 -0.029171227  0.018906181  0.092816957  0.028899699 -0.004535961

这不是很多,但我可能会从 hexbinhexbinplot 包开始。此 SO post.

中提供了几种替代方案

Formatting and manipulating a plot from the R package "hexbin"

因此,其中最困难的部分是将您的数据转换为正确的形状,这就是为什么分享真正看起来像您的数据的东西,而不仅仅是一个列是很好的。

假设您的数据是一个具有 10,000 行和 10 列的矩阵。我将只使用均匀分布,所以最后会是一个无聊的情节

n = 10000
k = 10
mat = matrix(runif(n * k), nrow = n)

接下来,我们将使用 apply、转置计算每列的分位数,并使其成为数据框:

dat = as.data.frame(t(apply(mat, MARGIN = 2, FUN = quantile, probs = seq(.1, 0.9, 0.1))))

添加一个x变量(因为我们转置了,每个x值对应原始数据中的一列)

dat$x = 1:nrow(dat)

我们现在需要将它变成 "long" 形式,按中位数附近某个偏差组的最小值和最大值分组,当然还要去掉 [= 引入的讨厌的百分号17=]:

library(dplyr)
library(tidyr)
dat_long = gather(dat, "quantile", value = "y", -x) %>%
    mutate(quantile = as.numeric(gsub("%", "", quantile)),
           group = abs(50 - quantile))

dat_ribbon = dat_long %>% filter(quantile < 50) %>%
    mutate(ymin = y) %>%
    select(x, ymin, group) %>%
    left_join(
        dat_long %>% filter(quantile > 50) %>%
        mutate(ymax = y) %>%
        select(x, ymax, group)
    )

dat_median = filter(dat_long, quantile == 50)

我们终于可以策划了。我们将为每个 "group" 绘制一个透明色带,即 10%-90% 间隔,20%-80% 间隔,... 40%-60% 间隔,然后在中线处绘制一条单线 ( 50%)。使用透明度,中间会更暗,因为它上面有更多的色带重叠。这不会从最小值到最大值,但如果您将 quantile 调用中的 probs 设置为从 0 到 1 而不是 .1 到 .9,它就会。

library(ggplot2)
ggplot(dat_ribbon, aes(x = x)) +
    geom_ribbon(aes(ymin = ymin, ymax = ymax, group = group), alpha = 0.2) +
    geom_line(aes(y = y), data = dat_median, color = "white")

值得注意的是,这不是传统的热图。热图通常意味着您有 3 个变量,x、y 和 z(颜色),其中每个 x-y 对都有一个 z 值。这里有两个变量,x 和 y,y 取决于 x。