You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:37:08