我有一个x行(即绘制数)和y列(观察数)的矩阵。它们代表y预测的分布。
现在我想制作抽奖的“热图”。也就是说,我想绘制一个'置信区间'(不是一个真正的置信区间,而只是所有带阴影的值),而是作为'热图'(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
答案 0 :(得分:3)
所以,这很难将你的数据转换成正确的形状,这就是为什么分享一些真正看起来像你的数据的东西,而不仅仅是一个列。
假设您的数据是一个包含10,000行和10列的矩阵。我只会使用统一的分布,所以最后会是一个无聊的情节
apply
接下来,我们将使用dat = as.data.frame(t(apply(mat, MARGIN = 2, FUN = quantile, probs = seq(.1, 0.9, 0.1))))
计算每列的分位数,转置并将其设为数据框:
x
添加dat$x = 1:nrow(dat)
变量(因为我们转置,每个x值对应原始数据中的一列)
quantile
我们现在需要将它变成一个“长”形式,按中位数周围某个偏差组的最小值和最大值分组,当然摆脱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)
引入的讨厌的百分号:
probs
最后我们可以策划。我们将为每个“组”绘制一条透明色带,即间隔为10%-90%,间隔为20%-80%,间隔为40%-60%,然后是中间的一条线(50%) )。使用透明度,中间会更暗,因为它上面有更多的丝带重叠。这不会从最小值变为最大值,但如果您将quantile
调用中的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")
设置为0到1而不是.1到.9。
layoutAttributesForELementsInRect
值得注意的是,不是传统的热图。热图通常意味着您有3个变量,x,y和z(颜色),其中每个x-y对都有一个z值。这里有两个变量,x和y,y取决于x。
答案 1 :(得分:1)
这不是很多,但我可能会从hexbin
或hexbinplot
包开始。这篇SO帖子中提出了几种备选方案。
Formatting and manipulating a plot from the R package "hexbin"