【问题标题】:2D heatmap of mean values with R具有 R 的平均值的 2D 热图
【发布时间】:2015-09-08 20:07:11
【问题描述】:

我正在尝试绘制这样的图,其中 alpha 旨在表示每个 bin 的 dat$c 的平均值:

library(ggplot2)

set.seed(1)

dat <- data.frame(a = rnorm(1000), b = rnorm(1000), c = 1/rnorm(1000),
  d = as.factor(sample(c(0, 1), 1000, replace=TRUE)))

# plot
p <- ggplot(dat, environment = environment()) +
  geom_bin2d(aes(x=a, y=b, alpha=c, fill=d),
  binwidth = c(1.0/10, 1.0/10))

但看起来 alpha 并不正确。请帮忙

【问题讨论】:

  • mean(c) 总是相同的值...因为它计算列 c 的平均值
  • 我知道 mean(c) 是向量 c 的均值。我只是把它作为一个占位符,因为我不知道答案。

标签: r plot histogram heatmap


【解决方案1】:

我不确定您希望看到什么,但这会在每个 bin 中计算 mean(dat$c) 并绘制结果。

library(ggplot2)
brks <- seq(-5,5,0.1)
lbls <- brks[-1]-0.05
gg.df <- aggregate(c~cut(a, brks, lbls)+cut(b,brks, lbls)+d,dat,FUN=mean)
names(gg.df)[1:2] <- c("a","b")
gg.df$a <- as.numeric(as.character(gg.df$a))
gg.df$b <- as.numeric(as.character(gg.df$b))
ggplot(gg.df, aes(x=a, y=b, alpha=c, fill=d)) + geom_raster() + coord_fixed()

编辑:回应 OP 的评论。

你可以试试:

dat$c <- with(dat,1/(a^2+b^2))

这使得dat$c 与半径(从 (0,0) 到该点的距离)成反比。现在运行与上面相同的代码:

gg.df <- aggregate(c~cut(a, brks, lbls)+cut(b,brks, lbls)+d,dat,FUN=mean)
names(gg.df)[1:2] <- c("a","b")
gg.df$a <- as.numeric(as.character(gg.df$a))
gg.df$b <- as.numeric(as.character(gg.df$b))
ggplot(gg.df, aes(x=a, y=b, alpha=c, fill=d)) + geom_raster() + coord_fixed() +
  scale_alpha_continuous(trans="log",breaks=10^(0:3))

正如预期的那样:一个图块在中心附近具有较高的alpha(透明度较低)。

我需要为 alpha 使用对数刻度,因为值的范围超过几个数量级。

【讨论】:

  • 非常好。谢谢你。每个 dat$d 也会这样做吗?我的意思是,如果同一个坐标 (a,b) 有多个 dat$d,那么每个 dat$d 的平均值应该是不同的?我们如何从视觉上证明解决方案是有效的?也许使用诸如 2D 正弦曲线之类的初始数据?
  • 查看我上面的编辑。关于dat$d,是的,对于具有多个dat$d 的垃圾箱,将会有重叠的图块。你会怎么选?老实说,在这一点上,它归结为你真正想要完成的事情。处理摘要中的数据不会有成效。
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多