r - 将具有第三个特征的大量点可视化为颜色 - 一种提高速度的方法

标签 r ggplot2 data-visualization

我有一个相当大的数据集(大约 5e5 行)(x, y)具有附加功能的坐标 z .它是这样的:

x <- rnorm(1e6, 0, 5)
y <- rnorm(1e6, 0, 10)
dist <- sqrt(x^2 + y^2)
z <- exp(-(dist / 8)^2)

我想用 z 来绘制它们用作颜色美学的功能。但简单 geom_point这么大的数据集需要一段时间:
data.frame(x, y, z) %>% 
  ggplot() + geom_point(aes(x, y, color = z)) 

enter image description here

所以我想我需要一种以某种方式聚合积分的方法。一种方法是将一个平面划分为一些小方块并平均所有 z位于正方形中的点的值。但从长远来看,这可能有点麻烦,最好使用一些已经可用的工具。于是我想到了geom_hex作为在我的情况下看起来不错的几何图形。但是fill美学设置为 count作为默认值。所以我的问题是:
  • 可以默认fill geom_hex 的值很容易改成平均值z特征?
  • 如果没有,我如何创建六边形而不是正方形,以便 z值可以在六边形内取平均值然后绘制?
  • 有没有其他方法可以提高绘制此类数据集的速度?

  • 编辑:

    建议解决方案的比较:
    library(microbenchmark)
    microbenchmark(
      'stat_summary_hex' = {data.frame(x, y, z) %>%                                                                                                   
        ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x))},
      'round_and_group' = {data.frame(x, y, z) %>%                                                   
          mutate(x=round(x, 0), y=round(y, 0)) %>%                                  
          group_by(x,y) %>%                                                         
          summarize(z = mean(z)) %>%                                                
          ggplot() + geom_hex(aes(x, y, fill = z), stat="identity")}
    )
    
    Unit: milliseconds
                 expr        min        lq       mean     median        uq        max neval
     stat_summary_hex   2.243791   2.38539   2.454039   2.426123   2.50871   2.963176   100
      round_and_group 183.785828 186.38851 188.296828 187.347476 189.10874 218.668487   100
    

    最佳答案

    也许它可以帮助stat_summary_hex() , 或 stat_summary_2d() .

    它们类似于 stat_summary() ,数据被划分为 xy ,然后由 z 总结, 使用 stat_summary_hex() 中指定的函数(或 stat_summary_2d())。

    library(tidyverse)
    data.frame(x, y, z) %>%  
    # here you can specify the function that welcomes the z parameter                                                                                              
    ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x))
    

    enter image description here

    它将回答您的第二个问题(十六进制)和您的第三个问题(正如您所说的,性能似乎没问题),而不是使用 geom_hex() (因此似乎在 geom_hex() 和速度之间存在交易)。

    编辑

    看着你的问题,我用不同的值对函数进行了微基准测试:
    Unit: milliseconds
      expr      min       lq     mean   median       uq       max neval
     3.5e5 205.0363 214.6925 236.8149 225.2286 238.6536  494.7897   100
       1e6 575.4861 597.4161 665.4396 620.9151 702.1622 1143.7011   100
    

    此外,您还可以指定垃圾箱,以具有或多或少的“精确”十六进制。默认值应该是 30,这意味着它将在 30 * 30 六边形区域中绘制点:
    data.frame(x, y, z) %>%                                                                                            
    ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x), bins = 60)
    

    例如( here multiplot() 函数,如有必要):
    set.seed(1)
    x <- rnorm(1e4, 0, 5)                                                     
    y <- rnorm(1e4, 0, 10)                                                    
    dist <- sqrt(x^2 + y^2)                                                   
    z <- exp(-(dist / 8)^2) 
    
    library(tidyverse)
    
    a1 <- data.frame(x, y, z) %>% 
          ggplot() + geom_point(aes(x, y, color = z)) 
    
    b1 <- data.frame(x, y, z) %>%  
         ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x))
    
    c1 <- data.frame(x, y, z) %>%  
          ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x), bins = 60)
    
    multiplot(a1,b1,c1, cols = 3)
    

    enter image description here

    如您所见,添加的六边形越多,您就越接近原始点。

    有数据:
    x <- rnorm(1e4, 0, 5)                                                     
    y <- rnorm(1e4, 0, 10)                                                    
    dist <- sqrt(x^2 + y^2)                                                   
    z <- exp(-(dist / 8)^2) 
    

    关于r - 将具有第三个特征的大量点可视化为颜色 - 一种提高速度的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52912945/

    相关文章:

    r - 双 y 轴(第二轴)在 ggplot2 中的使用

    r - Dotchart(在 base R 中)或 ggplot2 中具有分组数据的等价物

    r - 使用 x 轴上的最后一个值的 GGplot 顺序图例

    javascript - 使用 d3.js 创建径向图表

    javascript - 如何在 d3.js 中将标签添加到和弦图的弧线中

    r - 绘图和 beta 回归输出不匹配

    r - r 中二进制值的组合

    python - Matplotlib 表中的双 header

    networking - 如何延长 igraph 网络图中的边 (layout=fruchterman.reingold)?

    r - 用旁边其他地 block 的图例绘制多个地 block