Fra*_*fka 14 plot r probability heatmap
这与另一个问题有关:绘制加权频率矩阵.
我有这个图形(由R中的代码生成): 
#Set the number of bets and number of trials and % lines
numbet <- 36
numtri <- 1000
#Fill a matrix where the rows are the cumulative bets and the columns are the trials
xcum <- matrix(NA, nrow=numbet, ncol=numtri)
for (i in 1:numtri) {
x <- sample(c(0,1), numbet, prob=c(5/6,1/6), replace = TRUE)
xcum[,i] <- cumsum(x)/(1:numbet)
}
#Plot the trials as transparent lines so you can see the build up
matplot(xcum, type="l", xlab="Number of Trials", ylab="Relative Frequency", main="", col=rgb(0.01, 0.01, 0.01, 0.02), las=1)
Run Code Online (Sandbox Code Playgroud)
我非常喜欢这个绘图的构建方式,并且显示更频繁的路径比稀有路径更暗(但对于打印演示来说还不够清晰).我想做的是为数字生成某种hexbin或热图.考虑到这一点,似乎情节必须包含不同大小的垃圾箱(请参阅我的信封草图背面):

那么我的问题是:如果我使用上面的代码模拟一百万次运行,我怎样才能将它呈现为热图或hexbin,并且草图中显示了不同大小的区域?
澄清:我不想依靠透明度来表明审判通过部分情节的罕见性.相反,我想用热来表示稀有,并表现出一条共同的路径,如热(红色)和罕见的路径,如冷(蓝色).此外,我不认为垃圾箱应该是相同的大小,因为第一次试验只有两个路径可以,但最后一个有更多.因此,我根据这一事实选择了更改箱秤.基本上我计算一条路径通过单元格的次数(第1列中的2次,第2列中的3次等),然后根据它经过的次数对单元格进行着色.
更新:我已经有一个类似于@Andrie的情节,但我不确定它比顶级情节更清晰.这是图的不连续性,我不喜欢(为什么我想要某种热图).我认为,因为第一列只有两个可能的值,它们之间不应该存在巨大的视觉差距等等.因此我设想了不同大小的箱子.我仍然认为分档版本会更好地显示大量样本.

更新:此网站概述了绘制热图的过程:
要创建密度(热图)版本,我们必须有效地枚举图像中每个离散位置的这些点的出现.这是通过设置网格并计算点坐标"落入"该网格中每个位置的每个单独像素"区间"的次数来完成的.
也许该网站上的一些信息可以与我们已经拥有的信息相结合?
更新:我采取了一些Andrie写的一些问题来解决这个问题,这与我的想法非常接近:

numbet <- 20
numtri <- 100
prob=1/6
#Fill a matrix
xcum <- matrix(NA, nrow=numtri, ncol=numbet+1)
for (i in 1:numtri) {
x <- sample(c(0,1), numbet, prob=c(prob, 1-prob), replace = TRUE)
xcum[i, ] <- c(i, cumsum(x)/cumsum(1:numbet))
}
colnames(xcum) <- c("trial", paste("bet", 1:numbet, sep=""))
mxcum <- reshape(data.frame(xcum), varying=1+1:numbet,
idvar="trial", v.names="outcome", direction="long", timevar="bet")
#from the other question
require(MASS)
dens <- kde2d(mxcum$bet, mxcum$outcome)
filled.contour(dens)
Run Code Online (Sandbox Code Playgroud)
我不太明白发生了什么,但这似乎更像我想要制作的东西(显然没有不同大小的箱子).
更新:这与此处的其他图类似.这不太对:

plot(hexbin(x=mxcum$bet, y=mxcum$outcome))
Run Code Online (Sandbox Code Playgroud)
最后一次尝试 如上:

image(mxcum$bet, mxcum$outcome)
Run Code Online (Sandbox Code Playgroud)
这很不错.我希望它看起来像我的手绘草图.
And*_*rie 11
编辑
我认为以下解决方案可以满足您的要求.
(注意这很慢,尤其是reshape步骤)
numbet <- 32
numtri <- 1e5
prob=5/6
#Fill a matrix
xcum <- matrix(NA, nrow=numtri, ncol=numbet+1)
for (i in 1:numtri) {
x <- sample(c(0,1), numbet, prob=c(prob, 1-prob), replace = TRUE)
xcum[i, ] <- c(i, cumsum(x)/cumsum(1:numbet))
}
colnames(xcum) <- c("trial", paste("bet", 1:numbet, sep=""))
mxcum <- reshape(data.frame(xcum), varying=1+1:numbet,
idvar="trial", v.names="outcome", direction="long", timevar="bet")
library(plyr)
mxcum2 <- ddply(mxcum, .(bet, outcome), nrow)
mxcum3 <- ddply(mxcum2, .(bet), summarize,
ymin=c(0, head(seq_along(V1)/length(V1), -1)),
ymax=seq_along(V1)/length(V1),
fill=(V1/sum(V1)))
head(mxcum3)
library(ggplot2)
p <- ggplot(mxcum3, aes(xmin=bet-0.5, xmax=bet+0.5, ymin=ymin, ymax=ymax)) +
geom_rect(aes(fill=fill), colour="grey80") +
scale_fill_gradient("Outcome", formatter="percent", low="red", high="blue") +
scale_y_continuous(formatter="percent") +
xlab("Bet")
print(p)
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
2835 次 |
| 最近记录: |