有没有一种在地图上自动创建镶嵌六边形以可视化 hexbins 的好方法?

Is there a good way to automatically create tessellating hexagons on maps to visualise hexbins?

几个版本前,Tableau 引入了 HexBin 函数,允许将地理信息(或者,实际上,按 x-y 坐标分组的任何信息)分组到大小相等的六边形单元中。这在创建基础信息在地理上分布不均的地图时非常有用。

hexbins 的中心点可以直接绘制为点图,但这不如实际绘制六边形平铺平面的地图那样令人满意。一些博主建议使用形状而不是点来创建类似于预期结果的东西。 This Tableau blog uses hex bins but plots them using non-hexagonal shapes, for example. This blog 建议使用自定义六边形形状,但当 hexbin 比例变化时(相同的比例不适用于所有情况)它们不会细分和管理它们很烦人。

那么有没有一种自动创建镶嵌六边形以在允许不同六边形密度的地图上绘制的好方法?

补充问题:为什么 Tableau 没有内置此功能?六边形基于Lat/lon时如何调整地球形状?

是的,可以用简单的方法来完成,也可以用更复杂的方法来校正地球的形状

Tableau 中的 hexbin 函数适用于任何 X-Y 数据,将原始坐标分箱到六边形区域。

在地图上,数据通常以 Lat-Lon 坐标的形式出现,以度数表示。 Tableau 可以直接绘制这些数据,但通常使用稍微扭曲的 Web 墨卡托投影(远离赤道的区域被大大放大)来绘制。这意味着在 lat-lon 上定义的六边形 bin 的大小将不相同(当纬度高且远离赤道时,东西方向的 1 度表示地球表面上的距离要小得多,但在北纬方向上的 1 度表示南线总长约111公里)。

简单版本忽略这种失真并从经纬度坐标生成 hexbin。我将首先描述基于这种简单技术的方法。我基于一个包含英国每个邮政编码位置的数据集(~250 万行,不同地区的密度范围很广)。

基本方法包括几个步骤:

  • 使用允许调整六边形大小的参数生成比例因子
  • 生成一个值来定义六边形顶点的额外点(我通过向数据集的每一行添加一个值来实现这一点,该值由 1 到 6 的随机数组成)
  • 生成 hexbin 中心的经纬度坐标
  • 添加定义六边形顶点的 6 个点
  • 在地图上将六边形绘制为多边形(然后它们可以根据基础数据由任何聚合着色)

这是一个分步指南。

我定义了一个参数 hexbin size 来表示 hexbin 的半径(以度为单位)。然后根据数据集每一行中的纬度和经度值按以下方式定义十六进制 bin:

hexbiny 公式类似。

数据集本身包含一个名为 PointID 的字段,其中包含从 1 到 6 的值。(有多种方法可以实现此目的,但在数据集中执行此操作比在 tableau 中执行更容易,因为许多数据库包含保证整数的随机分布,可以通过简单的 mod 函数将其转换为 1 到 6 之间的数字)。我根据 PointID 中的值定义了一个名为 angle 的新字段(以帮助定义六边形的顶点):

现在我可以添加需要绘制的点来定义六边形:

经度相似:

此时,数据集应在每个 hexbin 中包含足够的行,以保证每个 hexbin 包含每个值都在 1-6 之间的行,以便定义六边形的所有点。

要绘制六边形,请适当设置 plot lon 和 plot lat 字段的地理角色,然后依次双击它们。然后将 hexbinx 和 hexbiny 拖到 detail 并将图表类型从自动更改为多边形。这将造成一些可怕的混乱,通过将 PointID 拖动到路径来解决。这应该给出这个(我还添加了行数来为六边形着色并调整颜色和透明度):

这表明基本技术有效。但它也显示了一个关键问题:六角多边形被扭曲了。如果你能忍受这个(靠近赤道或小区域问题不大)那就坚持下去。

但是如果您关心扭曲(视觉效果以及六边形不覆盖相同面积的事实),那么您必须做一些更复杂的事情。我在下面描述的内容基于 Tableau 的 Sarah Battersby 的工作。

下面的调整涉及简单解决方案之外的一些额外步骤:

  • 根据距离生成新的比例因子
  • 根据距离而非经纬度将经纬度值转换为 Web 墨卡托系统中的 X-Y 坐标
  • 在新坐标系中使用距离而非角度生成 hexbins
  • 将基于距离的 hexbin 转换回 lat-lon 坐标以定义 hexbin 中心
  • 使用距离坐标添加六边形顶点,然后转换回经纬度

您还需要为地球半径添加一个参数,它是坐标转换中的一个转换因子。

这是它的工作原理。首先转换为X-Y坐标:

现在我们可以在新坐标上使用hexbin分组:

将这些坐标转换回经纬度的公式如下(如果您只想绘制中心,则很有用):

请注意,复杂的是纬度公式。

但是为了使六边形多边形在绘制时能够正常工作,您必须在之前为 6 个顶点添加额外的点,然后 将它们转换回经纬度坐标。转换与上面的公式相同,最终公式如下所示:

额外的部分只是将固定距离添加到 hexbin 中心的坐标,基于由比例因子确定大小的六边形(其中有六个基于 Angle 的六个值)。

当以与前面的多边形图相同的方式绘制时,它应该如下所示(整理后):

现在六边形的视觉外观和实际尺寸都更好了。

对于包含上述计算的 Tableau Public 工作簿 see here

PS Tableau 可以而且应该将大部分功能构建到产品中,因为它会极大地简化有用的技术。