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
这不是很多,但我可能会从 hexbin
或 hexbinplot
包开始。此 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。
我有一个包含 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
这不是很多,但我可能会从 hexbin
或 hexbinplot
包开始。此 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。