使用R计算热图中的箱柜数

时间:2015-02-27 17:35:16

标签: r ggplot2 heatmap

这个问题来自这两个主题:

How to use stat_bin2d() to compute counts labels in ggplot2?

How to show the numeric cell values in heat map cells in r

在第一个主题中,用户想要使用stat_bin2d生成热图,然后想要将每个bin的计数写在热图上。用户最初想要使用的方法不起作用,最好的答案是说明stat_bin2d设计为使用geom =“rect”而不是“text”。没有给出令人满意的答复。

第二个问题几乎与第一个问题相同,但有一个关键的区别,第二个问题中的变量是文本,而不是数字。答案产生了所需的结果,将bin的计数值放在stat_2d热图中的bin上。

为了比较我准备以下代码的两种方法:

    library(ggplot2)
    data <- data.frame(x = rnorm(1000), y = rnorm(1000))
    ggplot(data, aes(x = x, y = y))
      geom_bin2d() + 
      stat_bin2d(geom="text", aes(label=..count..))

我们知道这首先给你错误:

“错误:geom_text需要以下缺失的美学:x,y”。

与第一个问题相同的问题。有趣的是,从stat_bin2d更改为stat_binhex可以正常工作:

    library(ggplot2)
    data <- data.frame(x = rnorm(1000), y = rnorm(1000))
    ggplot(data, aes(x = x, y = y))
      geom_binhex() + 
      stat_binhex(geom="text", aes(label=..count..))

哪个是伟大的,但总的来说,我不认为十六进制binning是非常清楚的,并且为了我的目的,我不会为我想要的数据工作。我真的想使用stat_2d。

为了实现这一点,我根据第二个答案准备了以下工作:

    library(ggplot2)
    data <- data.frame(x = rnorm(1000), y = rnorm(1000))
    x_t<-as.character(round(data$x,.1))
    y_t<-as.character(round(data$y,.1))
    x_x<-as.character(seq(-3,3),1)
    y_y<-as.character(seq(-3,3),1)
    data<-cbind(data,x_t,y_t)



    ggplot(data, aes(x = x_t, y = y_t)) +
      geom_bin2d() + 
      stat_bin2d(geom="text", aes(label=..count..))+
      scale_x_discrete(limits =x_x) +
      scale_y_discrete(limits=y_y) 

这可以解决数字数据的问题,但是为了实现这一点,你需要在将它带入ggplot之前确定bin宽度(我是通过舍入来完成的)。我在写这个问题的时候实际上已经弄明白了,所以我也可以完成。 这是结果:(事实证明我无法发布图像)

所以我真正的问题是,是否有人有更好的方法来做到这一点?我很高兴我至少得到了它的工作,但到目前为止,我没有看到在使用数字变量时将标签放在stat_2d箱上的答案。

有没有人有一个方法可以从stat_2dbin传递x和y参数到geom_text而不必使用解决方法?任何人都可以解释为什么它适用于文本变量但不适用于数字?

1 个答案:

答案 0 :(得分:16)

另一项工作(但可能更少的工作)。与..count..方法类似,您可以分两步从绘图对象中提取计数。

library(ggplot2)

set.seed(1)
dat <- data.frame(x = rnorm(1000), y = rnorm(1000))

# plot
p <- ggplot(dat, aes(x = x, y = y)) + geom_bin2d() 

# Get data - this includes counts and x,y coordinates 
newdat <- ggplot_build(p)$data[[1]]

# add in text labels
p + geom_text(data=newdat, aes((xmin + xmax)/2, (ymin + ymax)/2, 
                  label=count), col="white")

enter image description here