[英]plot a heatmap for binary categorical variables in R
我有一個 dataframe 包含許多二進制分類變量,我想為所有觀察顯示一個類似於熱圖的 plot,只顯示兩個 Z62848E3CE5804AA985513A7922FF87B 級別。 然后我想對其進行排序,以便那些在其行中具有最多“是”的觀察結果 ( ID ) 出現在頂部。
此處提供了示例數據集:
df1 <- data.frame(ID = c(1, 2, 3, 4, 5),
var1 = c('yes', 'yes', 'no', 'yes', 'no'),
var2 = c('no', 'yes', 'no', 'yes', 'no'),
var3 = c('yes', 'no', 'no', 'yes', 'yes'))
df1
ID var1 var2 var3
1 1 yes no yes
2 2 yes yes no
3 3 no no no
4 4 yes yes yes
5 5 no no yes
我嘗試使用 heatmap heatmap()
function 但我無法讓它工作。 你能幫我嗎?
如果你想使用ggplot
,你需要以長格式工作。 我將在這里使用tidyverse
:
library(tidyverse)
df_long <- df1 %>%
pivot_longer(cols = paste0("var",1:3))
order <- df_long %>%
group_by(name)%>%
summarise(n = sum(value == "yes"))%>%
arrange(n)%>%
pull(name)
df_long %>%
mutate(name = factor(name,levels = order))%>%
ggplot(aes(ID,name,fill = value))+
geom_tile()
有order
的部分是讓變量名的向量按它們的“是”數排序。 然后,您需要按照此順序設置因子變量的級別,以便讓您的熱圖按“是”的數量排序。
df_long %>%
group_by(name)%>%
summarise(n = sum(value == "yes"))%>%
arrange(n)
# A tibble: 3 x 2
name n
<chr> <int>
1 var2 2
2 var1 3
3 var3 3
您在heatmap
的正確軌道上。 將 df 的“是”/“否”列轉換為 0 和 1 的矩陣,並禁用一些默認值,例如縮放和排序。
mat1 <- 1*(df1[,-1]=="yes")
> mat1
var1 var2 var3
[1,] 1 0 1
[2,] 1 1 0
[3,] 0 0 0
[4,] 1 1 1
[5,] 0 0 1
# You only need this step if you want the IDs to be shown beside the plot
rownames(mat1) <- rownames(df1)
> mat1
var1 var2 var3
1 1 0 1
2 1 1 0
3 0 0 0
4 1 1 1
5 0 0 1
# reorder the matrix by rowSums before plotting
heatmap(mat1[order(rowSums(mat1)),], scale = "none", Rowv = NA, Colv = NA)
您可以通過指定col
參數來更改配色方案,例如
heatmap(mat1[order(rowSums(mat1)),], scale = "none", Rowv = NA, Colv = NA, col=c("lightgrey", "tomato"))
如果您希望 plot 從左到右讀取(每個 ID 一列),只需轉置矩陣
heatmap(t(mat1[order(rowSums(mat1)),]), scale = "none", Rowv = NA, Colv = NA)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.