如何为stat_summary_hex()定义六边形需包含的最小点数阈值?
实现六边形最小点数阈值过滤的两种方法
方法一:提前分箱过滤(推荐,更高效)
这种方法先通过hexbin包完成点数据的六边形分箱,过滤掉点数不足的分箱后再绘图,结果更干净:
library(hexbin) library(ggplot2) # 自定义最小点数阈值,比如设为5 min_point_count <- 5 # 1. 对原始点数据做六边形分箱,参数和原代码保持一致 hex_bin <- hexbin( x = df$lon, y = df$lat, xbins = 50, # 对应原stat_summary_hex的bins参数 xbnds = c(-20, 50), # 对应原xlim ybnds = c(24, 72) # 对应原ylim ) # 2. 提取每个分箱的点数、value均值,并过滤达标分箱 hex_stats <- data.frame( cell_id = hex_bin@cell, point_count = hex_bin@count, mean_value = tapply(df$value, hex_bin@cID, mean, na.rm = TRUE) ) valid_cells <- hex_stats$cell_id[hex_stats$point_count >= min_point_count] # 3. 生成达标六边形的多边形坐标数据 hex_polygons <- hexPolygons(hex_bin, cell = valid_cells, close = TRUE) hex_plot_data <- fortify(hex_polygons) %>% left_join(hex_stats, by = c("group" = "cell_id")) # 4. 绘制最终地图 ggplot() + # 背景地图层 geom_polygon( data = df.shp, aes(x = long, y = lat, group = group), fill = "grey", show.legend = FALSE ) + # 过滤后的六边形层 geom_polygon( data = hex_plot_data, aes(x = x, y = y, group = group, fill = mean_value), colour = "black" ) + coord_cartesian(xlim = c(-20, 50), ylim = c(24, 72)) + scale_fill_viridis(option = "A", breaks = c(0,1,2,3,4))
方法二:利用ggplot内置统计量快速过滤(代码更简洁)
直接在stat_summary_hex中通过after_stat获取每个六边形的点数,设置透明度过滤:
library(ggplot2) # 自定义最小点数阈值 min_point_count <- 5 ggplot(data = df, aes(lon, lat)) + geom_polygon(data = df.shp,aes(x=long, y=lat, group=group), fill = "grey", show.legend = FALSE) + stat_summary_hex( bins = 50, binwidth = 0.5, aes(z = value, alpha = after_stat(count >= min_point_count)), fun = "mean", colour = "black" ) + # 设置透明度过滤,隐藏不达标的六边形 scale_alpha_manual(values = c("TRUE" = 1, "FALSE" = 0), guide = "none") + xlim(-20,50) + ylim(24,72) + scale_fill_viridis(option = "A", breaks = c(0,1,2,3,4))
说明
- 方法一适合大型数据集,提前过滤能减少绘图时的计算量,结果中不会包含无效六边形;
- 方法二代码更简洁,适合快速调试,但本质是将无效六边形设为透明,底层仍存在分箱数据。
内容的提问来源于stack exchange,提问作者starski
相关产品推荐
相关产品推荐

