使用H3和Plotly构建六边形地图:一份全面的教程

使用H3和Plotly打造六边形地图:详尽教程

解锁六边形地图在数据分析中的潜力

Unsplash中的Sam Balye

通常,在我们想要使用等值图来可视化一个地域范围内的变量时,我们使用常见的行政地理形态。例如,如果我们想要看到欧洲各地的失业率,我们可以通过各个国家内的各州来可视化它们。

然而,行政区域通常是不规则的并且相互之间大小不一。因此,在可视化一个地域范围内的任何变量时,使用六边形来划分它是一个有用的替代方法。其优点包括提供平衡的几何形状以便更好地进行区域比较和改善地域覆盖。此外,六边形地图的好处是最小化视觉偏差,因为它们提供了区域的均衡表示,与传统的行政边界不同,后者有时会由于其不规则的形状和大小而扭曲数据的感知。

在本文中,我们将逐步解释如何使用Python创建六边形地图。为了实现这一目标,我们将使用两个可以简化地图构建过程的库:H3和Plotly。

分析数据:巴塞罗那市酒店数据集

本文使用的数据集可在巴塞罗那市的开放数据门户上找到。这个开放数据门户托管了有关巴塞罗那市的人口统计、经济和社会学数据,所有这些数据都是免费可访问的。我们使用的数据集包含有关巴塞罗那市所有酒店的信息,包括它们的位置。您可以从以下链接下载文件。

巴塞罗那市的酒店 – 巴塞罗那开放数据

巴塞罗那市酒店列表和位置

opendata-ajuntament.barcelona.cat

我们将在六边形地图上可视化的变量是酒店数量。本文的以下部分将逐步解释如何创建此可视化效果。

数据读取和清理

下载文件后,在我们的分析中的第一步是进行数据读取和清理。在此情况下,数据集包含许多与我们的分析无关的列,我们将不会对它们进行检查。我们将特别选择酒店的名称、其地理位置(纬度和经度),以及可能与其位置相关的属性(尽管在这个特定案例中我们不会使用它们)。选择了这些列后,我们将用更简单的名称重命名它们,然后我们的数据集就准备好进行可视化了。

酒店数据集(由作者创建的图片)

使用H3生成六边形网格

为了使用六边形地图可视化数据,我们的第一步是创建网格。为了实现这一目标,我们将使用由Uber开发的H3库。`get_hexagon_grid`函数负责创建六边形网格,生成一个`GeoDataFrame`格式的六边形网格。它首先在特定位置(纬度和经度)创建一个六边形,这里是巴塞罗那的中心。此六边形的大小由`resolution`参数定义。然后,额外的、相同大小的六边形将以同心圆的形式围绕中心六边形生成。要创建的同心圆数量由`ring_size`参数确定。最后,这个六边形集合被转化为一个`GeoDataFrame`,其中的每个六边形被分配一个与H3库提供的ID相对应的唯一ID。

我们不会在本文中详细讨论用于构建六边形网格的每个函数的具体细节,感兴趣的读者可以参考该库的文档,详细了解我们如何应用它。

H3 | H3

六边形层次地理空间索引系统

h3geo.org

下图说明了参数resolutionring_size对创建的网格的影响。 Resolution控制六边形的大小,即较高的分辨率会导致较小的六边形。另一方面,ring_size参数控制绕中心六边形创建的同心环数量。换句话说,较大的ring_size会导致更多同心环。在下面的图表中,所有的绘图都有相同的轴限制。正如您所见,使用较高的分辨率需要更多的同心环来覆盖相同的区域,这是因为如前所述,所有创建的六边形都与中心六边形的大小相同。

不同分辨率和环尺寸的六边形网格

选择的resolution取决于我们想要在特定区域中表示的变量的变化情况。如果有显著的变化,将考虑使用较高的resolution。在这个特定案例中,选择了分辨率9。此外,ring_size将取决于我们想要覆盖的区域和之前选择的resolution。在这个具体的案例中,ring_size45足以覆盖巴塞罗那市的整个区域。我们不会详细讨论如何得出这个结论,一般来说,我们得到了巴塞罗那市多边形的边界框,并确定了覆盖该区域所需的环数。

下面,您将以GeoDataFrame的形式找到六边形网络的创建,使用上述描述的参数和get_hexagon_grid函数。

如您在上面所见,get_hexagon_grid函数提供了一个具有两列的GeoDataFrame:第一列作为H3库分配给每个多边形的唯一ID,第二列包含实际的多边形,命名为geometry

将每个酒店分配到相应的六边形中

在创建六边形网格后,将需要将每个酒店分配到它所属的六边形中。 calculate_hexagon_ids函数计算每个酒店所属的六边形,并创建一个名为Hexagon_ID的新列来存储这些信息。

带有'Hexagon_ID'列的酒店数据集

现在,所有酒店的数据集还包括每个酒店所在的六边形的信息。这些信息以一个字母数字标识符的形式出现在Hexagon_ID列中。

基于要可视化的变量进行数据分组

分配了六边形的ID后,我们开始计算我们希望可视化的数据。在这个特定案例中,我们希望显示每个六边形中的酒店数量。为了实现这一点,我们进行了Hexagon_ID的分组和count操作。另外,我们还希望实施一种悬停功能,允许我们查看每个六边形中的酒店名称。为了实现这一点,我们对所有分组中的酒店名称进行了连接操作。我们使用HTML的<br>标签表示连接中的换行,因为Plotly使用HTML来定义其悬停文本。

聚合后的数据框

如上所示,分组后的数据框有三列:(1)Hexagon_ID,包含唯一的六边形标识符,(2)Count,表示该六边形内的酒店数量,(3)Hotels,包含该六边形内酒店的名称列表。

数据可视化:在巴塞罗那使用六边形进行酒店的地理表示

数据分组完成后,我们可以进入最后一步,使用Plotly创建六边形地图

create_choropleth_map函数负责处理分组数据集和包含每个六边形几何形状的数据集,生成六边形地图。这个地图可以让我们可视化城市的哪些区域有更高的酒店密度。

巴塞罗那市酒店分布热图(作者创建的图片)

要创建地图,我们将使用Plotly Express中的choropleth_mapbox函数。该函数根据每个六边形中检测到的酒店数量着色,利用用户选择的连续色彩比例尺,生成一个具有定义几何形状(在本例中是创建的一组六边形)的地图。当你将鼠标悬停在一个六边形上时,可以查看该六边形内的酒店列表。

在本例中,使用的背景地图是carto-positron,但可以轻松调整此参数以使用提供更好的城市街道和兴趣点识别的不同地图样式,例如open-street-map。此外,我们还可以使用不同的色彩比例尺。在之前的例子中,我们使用了Viridis色彩比例尺,而在这个例子中,我们使用了Reds色彩比例尺。

巴塞罗那市酒店分布热图(作者创建的图片)

该地图是交互式的,可以缩放感兴趣的区域。当放大红色调区域时,可以看到大部分巴塞罗那的酒店位于加泰罗尼亚广场附近。

巴塞罗那酒店密度最高的区域(作者创建的图片)

总结

带有行政区域的分级统计地图是可视化地理区域内变量分布的有价值工具。然而,由于行政区域的不规则形状和大小不一,这些地图在提供变量分布的可视化时存在偏见。因此,使用具有规则几何形状的六边形地图作为分析领域内分布的高度有用的替代方法。在本文中,我们详细解释了如何使用Uber H3库创建六边形网格,以及如何将该网格应用于Plotly可视化中,以描绘巴塞罗那的酒店分布