R语言 在六边形中显示平均丰度(而不是计数)

fnvucqvd  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(153)

在宣传册中,我想将平均丰度显示为六边形。我在leaflet.extras2包中找到了“addHexbin”,但它似乎只计算每个hexbin中的记录数量。我真正想要的是求和,或者理想情况下是另一列“abun”的平均值。我考虑转换数据集,以便每个单独的丰度记录都有一行,但有些记录的丰度为20 k +这将导致一个非常大的数据集,它仍然不能计算每个六边形的平均丰度,在六边形内计算似乎是六元体的一个基本的必要功能,所以也许我错过了一些明显的东西。

library(leaflet)
  library(leaflet.extras2)
  
  n <- 100000
  df <- data.frame(lat = rnorm(n, 42.0285, .01),
                   lng = rnorm(n, -93.65, .01),
                   abun = rnorm(n, 20000, 1000))
  
  leaflet(df)  %>%
    addTiles() %>%
    addHexbin(lng = ~lng, lat = ~lat,
              options = hexbinOptions(
                colorRange = c( "purple","blue","green", "yellow"),
                radiusRange = c(1, 20)
              ))

我还尝试使用另一个非官方的R包Leaflethex,它具有所需的求和/平均值函数,但不能很好地集成到我的Shiny应用程序中,并导致一些奇怪的结果(侧边栏菜单项消失,不与传单代理一起工作)

hfsqlsce

hfsqlsce1#

我找到的解决方案来自于Jared Lander的一个视频,他在视频中讨论了使用h3jsr h3六边形库作为基础六边形形状。数据被转换为空间对象,并与H3地址匹配。任何分析都可以在这个hexbin(平均值/总和)内完成,然后可以在leaflet中绘制。

library(dplyr)
library(h3jsr)
library(leafgl) #for faster plotting of hexbins
library(sf)

n <- 100000
df <- data.frame(lat = rnorm(n, 42.0285, 1),
                 lng = rnorm(n, -93.65, 1),
                 abun = runif(n, 0, 10000))

#dataframe to spatial object
df2 <- st_as_sf(x = df,                         
                coords = c("lng", "lat"),
                crs = "+datum=WGS84",
                na.fail=FALSE)

#Creates the hexbins for the coverage area and then calculate mean abun in each hexbin
# res=4 controls the size of the hexbin; smaller # = larger hexbins.  
hex5 <-df2 |>
  mutate(hex=point_to_cell(geometry, res=4)) |> #geometry column matches to H3 address
  st_drop_geometry()  |> #drop the geometry for faster processing
  group_by(hex) %>% #mean abundance by hex 
  summarise(mean_abun=mean(abun),
            .groups = 'drop')%>% 
  cell_to_polygon(simple=FALSE)#back to spatial 


#mapping the hexbins
leaflet("map") %>%
  addProviderTiles('CartoDB.Voyager')%>%addScaleBar(position='bottomleft') %>%
  addGlPolygons(data=hex5, fillColor="mean_abun",popup = ~mean_abun)

相关问题