我正在嘗試向 ggplot 熱圖添加噪聲或抖動,其中每個圖塊中的噪聲量由一個值確定。
例如,如果我制作這樣的熱圖:
library(tidyr)
library(tibble)
library(ggplot2)
set.seed(100)
s<-matrix(runif(25,0,1),5)
s[lower.tri(s)] = t(s)[lower.tri(s)]
diag(s) <- 0
colnames(s) <- rownames(s) <- paste0('x', 1:5)
df <- reshape2::melt(s)
ggplot(df, aes(x = Var1, y = Var2, fill = value))
geom_tile()
scale_fill_viridis_c()
theme_bw()
theme(aspect.ratio = 1)
這會導致類似:
但是,我想根據某個值向熱圖的每個圖塊添加噪聲。例如,如果我在資料框中添加另一列來表示噪聲:
df$noise <- runif(25)
我正在嘗試制作類似的東西:

我在 Photoshop 中制作了上面的情節。但我想知道是否有可能在 ggplot 中制作這樣的東西?因此,例如,如果一個圖塊的噪聲值為 0,則該圖塊上將沒有噪聲/抖動……如果該圖塊的噪聲/抖動值為 1,則該圖塊上會有很多噪聲那塊瓷磚。
uj5u.com熱心網友回復:
這是一種tidyr::uncount用于復制每個單元格的方法,然后根據noise變數分配一定程度的噪聲。
library(tidyverse)
df %>%
uncount(25, .id = "id") %>%
mutate(value2 = value rnorm(n(), sd = noise),
Var1_offset = (id - 1) %% 5,
Var2_offset = (id - 1) %/% 5) %>%
ggplot(aes(as.numeric(Var1) Var1_offset/5,
as.numeric(Var2) Var2_offset/5,
fill = value2))
geom_tile()
scale_fill_viridis_c()
theme_bw()
theme(aspect.ratio = 1)
scale_x_continuous(breaks = 0.5 (1:5),
labels = paste0("x", 1:5), name = "Var1")
scale_y_continuous(breaks = 0.5 (1:5),
labels = paste0("x", 1:5), name = "Var2")

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471596.html
