[英]R plot 'Heat map' of set of draws
我有一個矩陣,有x行(即繪制數)和y列(觀察數)。 它們代表y預測的分布。
現在我想制作抽獎的“熱圖”。 也就是說,我想繪制“置信區間”(不是一個真正的置信區間,但都只是在明暗之間的值),但作為一個“熱圖”(一個示例熱圖 )。 這意味着,如果例如觀察y = y *的大量抽取大約為1但是同一觀察也有5的抽取,則那么1周圍的置信區間的區域更暗(但整體是1到5之間仍然是陰影)。
要完全清楚:我喜歡這里的答案中的情節,但是我希望灰色置信區間被改為強度(即某些區域更暗)。
有人可以告訴我如何實現這一目標嗎?
提前致謝。
編輯:根據請求:示例數據。 第一列的前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
因此,這很難將您的數據轉換為正確的形狀,這就是為什么分享真正看起來像您的數據的東西,而不僅僅是單個列的原因。
假設您的數據是一個包含10,000行和10列的矩陣。 我只會使用統一分布,所以最后會是一個無聊的情節
n = 10000
k = 10
mat = matrix(runif(n * k), nrow = n)
接下來,我們將使用apply
,transpose計算每列的分位數,並使其成為數據框:
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)
我們現在需要將它變成一個“長”形式,按照中位數周圍某個偏差組的最小值和最大值分組,當然要擺脫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)
最后我們可以策划。 我們將為每個“組”繪制一條透明色帶,即間隔為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(顏色),其中每個xy對都有一個z值。 這里有兩個變量,x和y,y取決於x。
這不是很多,但我可能會從hexbin
或hexbinplot
包開始。 本SO帖子中提供了幾種替代方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.