使用纬度/经度坐标创建六边形单元格网格

4
我希望使用WGS84坐标(即由2个坐标X =纬度和Y =经度定义的单元格)创建具有六边形单元格的空间网格。
因此,我的设想是:
library(ggplot2);library(hexbin)
X<-seq(-10,20,by=0.1) # create coordinates vectors X and Y
Y<-seq(35,65,by=0.1)
z<-rnorm(301,0.5,1)
df<-as.data.frame(cbind(X,Y,z)) # create data frame with a z value for each cells (X,Y)
pl<-ggplot2(data=mat,aes(x=X,y=Y,z=z))+stat_summury_hex(fun=function(x) sum(x))
plot(pl)

但这样做并没有提供我想要的内容。
那么,我的问题是:如何使用纬度/经度坐标创建具有六边形单元的空间网格?
第二个问题是:如何创建以一个点为中心的网格(该点将表示重心,而不是通常的左下角)?
1个回答

3
如果我理解正确,您正在寻找expand.grid()函数:
xy <- expand.grid(X=X,Y=Y)
z<-rnorm(nrow(xy),0.5,1)
df<-as.data.frame(cbind(xy,z)) # create data frame with a z value for each cells (X,Y)
head(df)
pl<-ggplot(data=df,aes(x=X,y=Y,z=z))+stat_summary_hex(fun=function(x) sum(x))
plot(pl)

关于第二个问题,我不确定,但是由于所有的六边形都是相同大小的,并且需要相同的操作来居中,你可以通过适当地改变XY来统一移动它们。也许这也可以通过参数来完成,但我不确定。
[[编辑于7月23日]] 第二个问题是如何获得一个六边形坐标data.frame。需要一些挖掘,但这里提供一个例子:
library(hexbin)
coords <- hcell2xy( hexbin(x=X,y=Y))
head(coords)
      x        y
1 -10.0 35.00000
2  -9.5 35.86603
3  -8.5 35.86603
4  -9.0 36.73205
5  -8.0 36.73205
6  -7.5 37.59808

hcell2xy()是被ggplot2调用的关键函数,您可能需要明确指定参数xbins,该参数在ggplot2内部自动确定,但在两种情况下似乎默认为30。

[[编辑3,包括z级别]] 这是回答评论要求z级别的答案。从ggplot2:::hexBin中提取。

hb <- hexbin(x=X,y=Y)
# Convert to data frame
data.frame(
        hcell2xy(hb), 
        count = hb@count, 
        density = hb@count / sum(hb@count, na.rm=TRUE)
)

你可以选择后续使用countdensity 来表示颜色,但请注意:这两个选项与你传递给ggplot2z变量是不同的。如果您想根据其他统计数据进行总结,则建议您进一步了解这些函数的内部机制以了解事情是如何传递的。这就是我一直在做的事情。

非常感谢,这正是我在寻找的内容。 但我想知道如何将六边形单元格转换为数据框(即获取与“df”相同的数据框,但具有六边形单元格的坐标)。 我无法处理其他文件(如栅格、数据框等)进行分析。 因此,基本上,我该如何从“stat_summary_hex(fun = function(x)sum(x))”中检索数据框? - Remssssss
就像我之前说的一样(但与Tim Riffe同时!),我想将我的六边形单元格处理为经典数据框架。有人有解决方案吗? - Remssssss
你想要一个包含每个六边形单元格六个角坐标的数据框吗? - tim riffe
例如,我认为获取六角形单元格坐标的更合适方式是通过使用质心的纬度/经度来完成...?! - Remssssss
@Remssssss请查看答案的编辑。在代码中进行了深入挖掘,但找到了它。最终答案在:?hexbin:::hcell2xy中找到。 - tim riffe
谢谢Tim,我已经批准了你的答案。 不过,我该如何检索使用stat_summary_hex()函数计算出的z值? - Remssssss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接