是的,它可以通过简单有效的方式完成,也可以通过更复杂的方式来修正地球的形状
Tableau 中的 hexbin 函数适用于任何 X-Y 数据,以将原始坐标分箱为六边形区域。
在地图上,数据通常以经度坐标表示,以度为单位。 Tableau 可以直接绘制这些数据,但通常使用有点扭曲的 Web 墨卡托投影(远离赤道的区域被大大放大)。这意味着在纬度-经度上定义的六边形箱的大小将不相等(当纬度高且远离赤道时,东西方向的 1 度表示地球表面上的距离要小得多,但北纬的度数表示南线总长约111公里)。
简单版本会忽略这种失真,并根据经纬坐标生成 hexbins。我将首先描述基于这种简单技术的方法。我基于一个包含英国每个邮政编码位置的数据集(大约 250 万行,在不同地区具有广泛的密度)。
基本方法涉及几个步骤:
- 使用允许调整六边形大小的参数生成比例因子
- 生成一个值来定义六边形顶点的额外点(我通过向数据集的每一行添加一个值来实现这一点,该值由 1 到 6 的随机数组成)
- 生成 hexbin 中心的经纬度坐标
- 添加定义六边形顶点的 6 个点
- 在地图上将六边形绘制为多边形(然后可以根据基础数据通过任何聚合为它们着色)
这是一个分步指南。
我定义了一个参数hexbin size,它以度为单位表示hexbin 的半径。然后根据数据集每一行中的纬度和经度值按以下方式定义十六进制箱:
hexbiny 公式类似。
数据集本身包含一个名为 PointID 的字段,其中包含从 1 到 6 的值。(有多种方法可以实现这一点,但在数据集中执行此操作比在 tableau 中执行此操作更容易,因为许多数据库包含保证随机分布的散列函数整数,可以通过简单的 mod 函数转换为 1 到 6 的数字)。我根据 PointID 中的值定义了一个名为 angle 的新字段(以帮助定义六边形的顶点):
现在我可以添加需要绘制的点来定义六边形多边形:
经度相似:
此时,数据集应在每个 hexbin 中包含足够的行,以保证每个 hexbin 包含具有 1-6 的每个值的行,因此定义了六边形的所有点。
要绘制六边形,请适当设置绘图 lon 和绘图 lat 字段的 Geographic Role,然后依次双击每个字段。然后将 hexbinx 和 hexbiny 拖到 detail 并将图表类型从自动更改为多边形。这会产生一些可怕的混乱,通过将 PointID 拖到 Path 来解决。这应该给出这个(我还添加了行数来为六边形着色并调整颜色和透明度):
这表明基本技术有效。但它也显示了它的一个关键问题:六边形多边形被扭曲了。如果你能忍受这个(靠近赤道或小区域的问题不大),那就坚持下去。
但是,如果您关心扭曲(视觉以及六边形不覆盖相等区域的事实),那么您必须做一些更复杂的事情。我在下面描述的内容基于 Tableau 的 Sarah Battersby 的工作。
除了简单的解决方案之外,下面的调整还涉及一些额外的步骤:
- 根据距离生成新的比例因子
- 在 Web Mercator 系统中根据距离而非经度度将经度值转换为 X-Y 坐标
- 在新坐标系中使用距离而不是角度生成 hexbins
- 将基于距离的 hexbin 转换回 lat-lon 坐标以定义 hexbin 中心
- 使用距离坐标添加六边形顶点,然后转换回经纬度
您还需要为地球半径添加一个参数,该参数是坐标转换中的转换因子。
这就是它的工作原理。首先转换为 X-Y 坐标:
现在我们可以在新坐标上使用 hexbin 分组:
将这些坐标转换回经纬度的公式如下(如果您只想绘制中心,则很有用):
请注意,复杂的是纬度公式。
但要使六边形多边形在绘制时正常工作,您必须为 6 个顶点添加额外的点在将它们转换回经纬度坐标。转换与上面的公式相同,最终公式如下所示:
额外的部分只是根据按比例因子调整大小的六边形为六边形中心的坐标添加一个固定距离(根据角度的六个值,其中有六个)。
当以与上一个多边形图相同的方式绘制时,它应该如下所示(整理后):
现在六边形的视觉外观和实际大小都更好。
对于包含上述计算的 Tableau Public 工作簿see here。
PS Tableau 可以而且应该将大部分此类功能构建到产品中,因为它将大大简化一项有用的技术。