这个问题来自这两个主题:
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而不必使用解决方法?任何人都可以解释为什么它适用于文本变量但不适用于数字?
答案 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")