Specifying the scale for the density in ggplot2's stat_density2d

前端 未结 2 1128
暖寄归人
暖寄归人 2020-12-15 12:18

I\'m looking to create multiple density graphs, to make an \"animated heat map.\"

Since each frame of the animation should be comparable, I\'d like the density -> co

相关标签:
2条回答
  • 2020-12-15 13:14

    I would like to leave an update for this question. As of July 2016, stat_density2d is not taking breaks any more. In order to reproduce the graphic, you need to move breaks=1e-6*seq(0,10,by=2) to 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))
    
    0 讨论(0)
  • 2020-12-15 13:18

    So to have both plots show contours with the same levels, use the breaks=... argument in stat_densit2d(...). To have both plots with the same mapping of alpha to level, use scale_alpha_continuous(limits=...).

    Here is the full code to demonstrate:

    library(ggplot2)
    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)), 
                       breaks=1e-6*seq(0,10,by=2),geom="contour", bins=4, size= 2)+
        scale_alpha_continuous(limits=c(0,1e-5))+
        scale_color_discrete("Condition")
    }
    library(gridExtra)
    do.call(grid.arrange,c(g,ncol=2))
    

    And the result...

    0 讨论(0)
提交回复
热议问题