R 分类变量计数的热图
我有一个项目的数据框架,每个项目都有多个分类器列,它们是分类变量R 分类变量计数的热图,r,ggplot2,heatmap,categorical-data,pheatmap,R,Ggplot2,Heatmap,Categorical Data,Pheatmap,我有一个项目的数据框架,每个项目都有多个分类器列,它们是分类变量 ID test1 test2 test3 1 A B A 2 B A C 3 C C C 4 A A B 5 B B B 6 B A C 我想使用ggplot2为每个测试列组合(tes
ID test1 test2 test3
1 A B A
2 B A C
3 C C C
4 A A B
5 B B B
6 B A C
我想使用ggplot2为每个测试列组合(test1vtest2、test1vtest3等)生成一个热图。
热图的x侧包含该测试列中的所有因子(在本例中为A、B、C),y侧包含其他测试的所有因子,并且热图中的框应基于具有该分类器组合的ID计数着色
例如,在上面的输入中,如果我们在test1和test2之间有热图,那么在test1的B和test2的A的交点处的框将是最亮的,因为有两个id与该组合在一起。
我希望使用这些热图来分析哪些测试对数据集最为一致,但不能使用皮尔逊R相关性,因为它们是分类变量
我熟悉ggplot,这就是为什么我更喜欢这个软件包,但如果在pheatplot中更容易,我可以学习它。你的问题有点不清楚,但我认为你正在寻找类似的东西。我不是ggplot2的人,所以我会让其他人提供代码
x <- read.table(text="ID test1 test2 test3
1 A B A
2 B A C
3 C C C
4 A A B
5 B B B
6 B A C", stringsAsFactors=FALSE, header=T)
xl <- reshape2::melt(data = x, id.vars="ID", variable.name = "Test", value.name="Grade")
xl$Test_Gr <- apply(xl[,2:3], 1, paste0, collapse="_")
xw <- reshape2::dcast(xl, ID ~ Test_Gr, fun.aggregate = length)
xwm <- as.matrix(xw[,-1])
xc <- t(xwm) %*% xwm
colnames(xc) <- colnames(xw)[-1]
rownames(wc) <- colnames(xw)[-1]
gplots::heatmap.2(xc, trace="none", col = rev(heat.colors(15)))
x花了一些时间才意识到如何做到这一点,但我仍然不确定这是最好的方法
数据:
图书馆
创建一次2个因素的所有组合(也包括测试)
fcombs <- expand.grid(LETTERS[1:3], LETTERS[1:3], stringsAsFactors = F)
tcombs <- as.data.frame(combn(colnames(dat[,-1]), 2), stringsAsFactors = F)
创建绘图列表
pl <- lapply(seq_along(tcombs), function(i){
gtitle = paste(tcombs[[i]], collapse = " ~ ")
dtl[[i]] %>%
ggplot(aes(x = Var1, y = Var2, fill = N)) +
geom_tile() +
theme_tufte() +
theme(axis.title = element_blank()) +
ggtitle(gtitle)
}
)
将所有内容放入结果列表并绘制
resl <- c(pl, tbl)[c(1, 4, 2, 5, 3, 6)]
grid.arrange(grobs = resl, ncol = 2, nrow = 3)
resl您对热图的描述似乎在x轴上有A,B,C,在y轴上有A,B,C。。。但是您的测试有三列,而不是两列。如果您包含来自pheatmap
的绘图以及用于生成它的代码(来自此示例数据),可能会有所帮助。抱歉,我想我不清楚。我想要一个每列组合的数字,其中这两列的因子在轴上。对于这个示例数据,我想要3个不同的图。如果我可以使用pheatmap生成绘图,我就不需要问这个问题。这就是我一直在寻找的。我真的想要3个独立的热图,一个用于Test1对Test2,Test1对Test3,Test2对Test3。但我将使用您提供的代码,并了解它是如何工作的。谢谢我只是浏览了一下你的代码,看看它是如何工作的。我想我可以很容易地调整它来创建我最初寻找的热图。感谢您向我展示dcast和melt方法!
dtl <- lapply(tcombs, function(i){
select(dat, ID, i) %>%
full_join(x = fcombs, by = c("Var1" = i[1], Var2 = i[2])) %>%
group_by(Var1, Var2) %>%
mutate(N = sum(!is.na(ID)), ID = NULL) %>%
ungroup()
}
)
pl <- lapply(seq_along(tcombs), function(i){
gtitle = paste(tcombs[[i]], collapse = " ~ ")
dtl[[i]] %>%
ggplot(aes(x = Var1, y = Var2, fill = N)) +
geom_tile() +
theme_tufte() +
theme(axis.title = element_blank()) +
ggtitle(gtitle)
}
)
tbl <- lapply(tcombs, function(i) tableGrob(select(dat, ID, i),
theme = ttheme_minimal()))
resl <- c(pl, tbl)[c(1, 4, 2, 5, 3, 6)]
grid.arrange(grobs = resl, ncol = 2, nrow = 3)