R图';热图';图纸集

R图';热图';图纸集,r,plot,statistics,confidence-interval,R,Plot,Statistics,Confidence Interval,我有一个矩阵,其中有x行(即绘制的数量)和y列(观察的数量)。它们代表了y型预测的分布 现在我想做一个画的“热图”。也就是说,我想绘制一个“置信区间”(不是真正的置信区间,而是中间带阴影的所有值),而是作为“热图”(一个示例)。这意味着,例如,如果观察y=y*的许多绘图都在1左右,但同样的观察也有5的绘图,那么1周围的置信区间区域更暗(但整个在1和5之间的区域仍然是阴影) 要完全清楚:例如,我喜欢答案中的绘图,但我希望灰色置信区间改为强度颜色(即某些区域更暗) 有人能告诉我怎样才能做到这一点吗

我有一个矩阵,其中有x行(即绘制的数量)和y列(观察的数量)。它们代表了y型预测的分布

现在我想做一个画的“热图”。也就是说,我想绘制一个“置信区间”(不是真正的置信区间,而是中间带阴影的所有值),而是作为“热图”(一个示例)。这意味着,例如,如果观察y=y*的许多绘图都在1左右,但同样的观察也有5的绘图,那么1周围的置信区间区域更暗(但整个在1和5之间的区域仍然是阴影)

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

有人能告诉我怎样才能做到这一点吗

提前谢谢

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


这不是很多,但我可能会从
hexbin
hexbinplot
包开始。本文介绍了几种备选方案


因此,最困难的部分是将数据转换为正确的形状,这就是为什么共享与您的数据非常相似的内容,而不仅仅是一列

假设您的数据是一个包含10000行和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值对应于原始数据中的一列)

我们现在需要把它变成一个“长”的形式,按中位数周围某个偏差组的最小值和最大值分组,当然要去掉分位数引入的讨厌的百分号:

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)


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

发布一些示例数据,也许我们中的一个人会对此进行破解。@MikeWise我现在在OP中发布了一些示例数据。谢谢:)!我很难理解你的尺寸。。。您将给出一个3d示例(x、y和颜色标注为z的热图)和一个2d示例(x和y,其中y恰好有一个置信区间)。如果要绘制二维矩阵的每个值,热图将起作用。如果你想将二维矩阵的每一列汇总成(比如)具有置信区间的均值或中位数,那么热图是不合适的,但链接到的第二个图很容易。我建议至少共享两列数据。。。一列会在热图中生成一个正方形吗?还是热图中的一列正方形?还是一个有置信区间的单点?@Gregor所有列都是相似的,这就是为什么我发布了一个。澄清一下:所有列实际上都有10000个值。我想要的是在10000个值中的最小值和最大值之间进行着色,但是因为有这么多的值,所以这种着色的一些区域应该反映出10000个值中更多的值在该区域周围的事实。希望这对你来说更有意义。谢谢,这可能是一个很好的起点(投票赞成)!我会看看,但希望有人能找到更简单的解决方案。今晚晚些时候我会试一试。当我运行
dat_long=gather(dat,“quantile”,value=“y”,-x)%%>%mutate(quantile=as.numeric(gsub(“,”,quantile)),group=abs(50-quantile))
时,我得到as.character(x)中的错误
error:无法将类型“closure”强制为类型为“character”的向量。
。你知道这是什么原因吗?@dreamer Oops,我在前面更改列名的尝试中留下了一行。删除
names(dat)=…
行,一切都应该正常。(答案代码中已经进行了编辑。)不过,我很抱歉地说,谢谢你,但我仍然收到相同的消息(当我运行
dat_long…
语句时)。对于可能出现的问题,您还有其他建议吗?删除的行修改了
dat
,因此您必须从头开始(或从最先定义
dat
的位置开始)。如果在那之后你仍然有问题,你可能有一些功能掩蔽正在进行。我刚刚进行了测试,我的代码在新的R会话中运行良好。函数掩蔽确实导致了问题。现在可以了:)!非常感谢,你应该为这个答案获得更多的选票!作为最后一个问题:是否有可能轻易地用不同的颜色和黑色的阴影进行实验(我看到了一个关于平均线的论点,但对于其余的则没有)?如果没有,也很好,情节现在看起来真的很好!我真的很感激你帮助我!
dat$x = 1:nrow(dat)
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)
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")