Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 分类变量计数的热图_R_Ggplot2_Heatmap_Categorical Data_Pheatmap - Fatal编程技术网

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)