r - 在 ggplot2 的 stat_density2d 中指定密度的比例

标签 r plot ggplot2 kernel-density

我希望创建多个密度图,以制作“动画热图”。

由于动画的每一帧都应该具有可比性,因此我希望每个图形上的密度 -> 颜色映射对于所有图形都相同,即使每个图形的数​​据范围都发生变化。

这是我用于每个单独图形的代码:

ggplot(data= this_df, aes(x=X, y=Y) ) + 
    geom_point(aes(color= as.factor(condition)), alpha= .25) +
    coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() +
    stat_density2d(mapping= aes(alpha = ..level..), geom="polygon", bins=3, size=1)

想象一下,我使用相同的代码,但是“this_df”在每一帧上都会发生变化。所以在一张图中,密度范围可能从 0 到 4e-4。另一方面,密度范围从 0 到 4e-2。

默认情况下,ggplot 将为每个计算不同的密度 -> 颜色映射。但这意味着这两个图表——动画的两帧——实际上没有可比性。如果这是直方图或密度图,我只需调用 coord_cartesian 并更改 x 和 y lim。但是对于密度图,我不知道如何更改比例。

我能找到的最接近的是这个:

Overlay two ggplot2 stat_density2d plots with alpha channels

但是我没有选择将两个密度图放在同一个图上,因为我希望它们是不同的框架。

任何帮助将不胜感激!

编辑:

这是一个可重现的示例:
set.seed(4)
g = list(NA,NA)
for (i in 1:2) {

  sdev = runif(1)
  X = rnorm(1000, mean = 512, sd= 300*sdev)
  Y = rnorm(1000, mean = 384, sd= 200*sdev)

  this_df = as.data.frame( cbind(X = X,Y = Y, condition = 1:2) )

  g[[i]] = ggplot(data= this_df, aes(x=X, y=Y) ) + 
    geom_point(aes(color= as.factor(condition)), alpha= .25) +
    coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) + scale_y_reverse() +
    stat_density2d(mapping= aes(alpha = ..level.., color= as.factor(condition)), geom="contour", bins=4, size= 2) 

}
print(g) # level has a different scale for each

最佳答案

我想留下这个问题的更新。截至 2016 年 7 月,stat_density2d不服用breaks没有了。为了重现图形,您需要移动breaks=1e-6*seq(0,10,by=2)scale_alpha_continuous() .

set.seed(4)
g = list(NA,NA)
for (i in 1:2) {
    sdev = runif(1)
    X = rnorm(1000, mean = 512, sd= 300*sdev)
    Y = rnorm(1000, mean = 384, sd= 200*sdev)
    this_df = as.data.frame( cbind(X = X,Y = Y, condition = 1:2) )

g[[i]] = ggplot(data= this_df, aes(x=X, y=Y) ) +
         geom_point(aes(color= as.factor(condition)), alpha= .25) +
         coord_cartesian(ylim= c(0, 768), xlim= c(0,1024)) +
         scale_y_reverse() +
         stat_density2d(mapping= aes(alpha = ..level.., color= as.factor(condition)),
         geom="contour", bins=4, size= 2) +
         scale_alpha_continuous(limits=c(0,1e-5), breaks=1e-6*seq(0,10,by=2))+
         scale_color_discrete("Condition")
    }

do.call(grid.arrange,c(g,ncol=2))

关于r - 在 ggplot2 的 stat_density2d 中指定密度的比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24845652/

相关文章:

python - 设置xlim后如何根据屏幕上显示的数据自动设置ylim

haskell - 无论如何改变 Haskell GNUPlot.Simple 包中绘图的颜色

r - LDA 分析时下标越界

r - 结合 `for loop` 和 ggplotGrob

r - 在 R 中为每天采样的数据创建时间序列

r - 在 ggplot2 中绘制季节性时间序列

r - 将图像添加到 ggplot 标题

r - geom_blank 丢弃 NA

r - 如何计算 R 中数据中 NA 的分位数

r - 在 R 中围绕统计测试编写函数