在ggplot地图中替换点为六边形失败,求解决方案
问题原因说明
geom_hex 是六边形分箱统计工具,它会对数据进行区域分箱并计算每个箱的统计量(如计数),并非用来将单个数据点替换为六边形,因此不符合你的需求。
解决方案
以下两种方法可实现将每个数据点替换为六边形的效果,同时修正你原代码中 scale_colour_gradientn 参数的错误(scales::rescale 需传入向量,原代码缺少 c() 包裹):
方法一:使用 ggforce 包(推荐,简洁高效)
ggforce::geom_regon 可直接绘制指定边数的正多边形,边数设为6即可得到六边形:
# 若未安装 ggforce 先执行安装 # install.packages("ggforce") library(ggplot2) library(ggforce) ggplot() + geom_regon(data=df, aes(x=x, y=y, fill = value), sides = 6, radius = 0.05, na.rm = FALSE) + # sides=6 指定为六边形,radius调整大小 scale_fill_gradientn(colours = c('#80146E','#804AA4','#6771B8','#379BC2', '#3ABCBF','#79D4B8','white','#FCEE88','#F8C34B', '#F7A72B', '#F4792D'), values = scales::rescale(c(-10, -8, -6, -4, -2, -1, 0, 0.3, 0.5, 0.7, 1))) + # 修正:用c()包裹数值向量 theme_void() + coord_map()
- 若需要六边形仅保留边框,可将
fill替换为color,并设置fill=NA、stroke=1(调整边框粗细); radius值需根据你的数据分辨率调整(示例中设为0.05,适配你数据中x轴0.1的间隔,避免六边形重叠)。
方法二:手动生成六边形坐标(无需额外包)
通过函数生成每个数据点对应的六边形顶点坐标,再用 geom_polygon 绘制:
library(ggplot2) library(dplyr) # 定义生成六边形顶点的函数 generate_hexagon <- function(x, y, radius) { angles <- seq(0, 2*pi, length.out = 7) # 生成7个点(含闭合点) data.frame( x_hex = x + radius * cos(angles), y_hex = y + radius * sin(angles), group = paste(x, y) # 为每个六边形设置分组,确保独立绘制 ) } # 转换数据集,生成所有六边形的顶点数据 df_hex <- df %>% rowwise() %>% do(generate_hexagon(.$x, .$y, radius = 0.05)) %>% left_join(df, by = c("x" = "x", "y" = "y")) # 绘图 ggplot() + geom_polygon(data=df_hex, aes(x=x_hex, y=y_hex, group=group, fill=value), na.rm = FALSE) + scale_fill_gradientn(colours = c('#80146E','#804AA4','#6771B8','#379BC2', '#3ABCBF','#79D4B8','white','#FCEE88','#F8C34B', '#F7A72B', '#F4792D'), values = scales::rescale(c(-10, -8, -6, -4, -2, -1, 0, 0.3, 0.5, 0.7, 1))) + theme_void() + coord_map()
内容的提问来源于stack exchange,提问作者Tristan
相关产品推荐
相关产品推荐

