地理空间可视化已成为在地理背景下理解和表示数据的基本工具。它在各种现实世界的应用中发挥着关键作用,从城市规划和环境研究到房地产和交通运输。例如,城市规划者可能会利用地理空间数据来优化公共交通路线,而房地产专业人士则可以利用它来分析特定地区的房产价值趋势。使用 Python,您可以利用 geopandas、Matplotlib 和 contextily 等库的力量来创建引人注目的可视化。在本章中,您将深入研究一个可视化艾姆斯(Iowa)房屋销售价格的代码片段,并分解每个步骤以理解其目的和功能。
让我们开始吧。

从数据到地图:使用 Python 可视化艾姆斯房价
照片来自 Annie Spratt。部分权利保留。
概述
这篇文章分为六个部分;它们是:
- 安装必要的 Python 包
- 导入必要的库
- 加载和准备数据
- 设置坐标参考系统 (CRS)
- 创建凸包
- 可视化数据
安装必要的 Python 包
在深入研究 Python 的地理空间可视化世界之前,正确设置您的开发环境至关重要。在 Windows 上,您可以打开命令提示符或 PowerShell。如果您使用的是 macOS 或 Linux,终端应用程序是您访问命令行世界的门户。此外,为确保您能够访问所有必需的 Python 库,拥有对 Python 包索引 (PyPI) 的访问权限至关重要,PyPI 是 Python 包的官方第三方软件存储库。
要安装必需的包,您可以在终端或命令行界面中使用以下命令
1 2 3 4 5 |
pip install pandas pip install geopandas pip install matplotlib pip install contextily pip install shapely |
成功安装所需的包后,您就可以导入必要的库并开始您的地理空间可视化之旅了。
使用我的书 《数据科学入门指南》 **开启您的项目**。它提供**自学教程**和**可运行的代码**。
导入必要的库
在深入可视化之前,导入必要的库来支持我们的可视化非常重要。
1 2 3 4 5 |
import pandas as pd import geopandas as gpd import matplotlib.pyplot as plt import contextily as ctx from shapely.geometry import Point |
我们将使用几个 Python 库,包括
- pandas: 用于数据操作和分析。
- geopandas: 用于处理地理空间数据。
- matplotlib: 用于创建静态、动画和交互式可视化。
- contextily: 用于向我们的绘图添加底图。
- shapely: 用于平面几何对象的操纵和分析。
加载和准备数据
Ames.csv
数据集 包含有关艾姆斯(爱荷华州)房价的详细信息。这包括房屋的各种属性,例如大小、年龄和状况,以及它们的地理坐标(纬度和经度)。这些地理坐标对我们的地理空间可视化至关重要,因为它们使我们能够在地图上绘制每栋房屋,从而为销售价格提供空间背景。
1 2 3 4 5 6 |
# 加载数据集 Ames = pd.read_csv('Ames.csv') # 将 DataFrame 转换为 GeoDataFrame geometry = [Point(xy) for xy in zip(Ames['Longitude'], Ames['Latitude'])] geo_df = gpd.GeoDataFrame(Ames, geometry=geometry) |
通过将 pandas DataFrame 转换为 GeoDataFrame,我们可以利用数据集上的地理空间功能,将原始数据转换为适合地理空间分析和可视化的格式。
设置坐标参考系统 (CRS)
坐标参考系统 (CRS) 是准确地理空间操作和制图学的基本方面,它决定了我们的数据如何在地球表面上对齐。在不同的 CRS 下,两点之间的距离会有所不同,地图的外观也会有所不同。在我们的示例中,我们使用“EPSG:4326”表示法为 GeoDataFrame 设置了 CRS,这对应于广泛使用的 WGS 84(或世界大地测量系统 1984)纬度-经度坐标系。
1 2 |
# 为 GeoDataFrame 设置 CRS geo_df.crs = "EPSG:4326" |
WGS 84 是一个成立于 1984 年的全球参考系统,是卫星定位、GPS 和各种地图应用的事实标准。它使用三维坐标系,其中纬度和经度定义了地球表面的位置,高度表示相对于参考椭球体的高度。
除了 WGS 84 之外,还有许多坐标参考系统可以满足各种地图制作需求。选择包括通用横轴墨卡托投影 (UTM),它提供适合区域地图制作的平面笛卡尔坐标;欧洲石油勘探集团 (EPSG) 选项,例如用于基于 Web 的地图制作的“EPSG:3857”;以及州平面坐标系统 (SPCS),提供美国境内的州特定系统。选择合适的 CRS 取决于比例、精度和数据的地理范围等因素,以确保地理空间分析和可视化的准确性。
创建凸包
凸包提供了围绕所有数据点的一个边界,提供了我们数据地理分布的视觉表示。
1 2 3 4 5 |
# 创建数据点周围的凸包 convex_hull = geo_df.unary_union.convex_hull convex_hull_geo = gpd.GeoSeries(convex_hull, crs="EPSG:4326") convex_hull_transformed = convex_hull_geo.to_crs(epsg=3857) buffered_hull = convex_hull_transformed.buffer(500) |
从“EPSG:4326”转换为“EPSG:3857”对于几个原因至关重要
- 基于 Web 的可视化:“EPSG:3857”针对 Google Maps 和 OpenStreetMap 等基于 Web 的地图应用程序进行了优化。通过将我们的数据转换为此 CRS,我们确保它能够与基于 Web 的底图正确叠加。
- 以米为单位缓冲:缓冲操作会在凸包周围添加一个边距。在“EPSG:4326”中,坐标单位是度,这使得以米为单位进行缓冲变得困难。通过转换为“EPSG:3857”,我们可以通过 500 米精确地缓冲我们的凸包,从而在艾姆斯周围提供清晰的边界。
通过缓冲凸包,我们不仅可视化了数据的分布,还为可视化提供了地理背景,强调了感兴趣的区域。
想开始学习数据科学新手指南吗?
立即参加我的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
可视化数据
准备好数据后,就可以通过可视化让数据生动起来了。我们将绘制个人房屋的销售价格,并使用颜色渐变来表示不同的价格范围。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 绘制带有销售价格、底图和缓冲凸包作为边框的地图 fig, ax = plt.subplots(figsize=(12, 8)) geo_df.to_crs(epsg=3857).plot(column='SalePrice', cmap='coolwarm', ax=ax, legend=True, markersize=20) buffered_hull.boundary.plot(ax=ax, color='black', label='Buffered Boundary of Ames') ctx.add_basemap(ax, source=ctx.providers.CartoDB.Positron) ax.set_axis_off() ax.legend(loc='upper right') colorbar = ax.get_figure().get_axes()[1] colorbar.set_ylabel('Sale Price', rotation=270, labelpad=20, fontsize=15) plt.title('Sale Prices of Individual Houses in Ames, Iowa with Buffered Boundary', fontsize=18) plt.show() |
使用的颜色渐变“coolwarm”是一种发散型色图。这意味着它有两种不同的颜色代表光谱的两端,中间有一个中性颜色。在我们的可视化中
- 较冷的颜色(蓝色)代表销售价格较低的房屋。
- 较暖的颜色(红色)表示销售价格较高的房屋。
这种色图的选择使读者能够快速识别高价值和低价值的区域,从而为了解艾姆斯房价的分布提供了见解。缓冲边界进一步强调了感兴趣的区域,为可视化提供了背景。
这张地图是几个组件的组合:底图由 contextily 从 OpenStreetMap 引入,描绘了特定纬度-经度的地形。彩色点基于 pandas DataFrame 的数据,但通过 geopandas 转换为地理 CRS,这应该与底图对齐。
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
教程
资源
总结
在本文中,我们深入探讨了使用 Python 进行地理空间可视化的细节,重点关注艾姆斯(爱荷华州)房价的可视化。通过对代码进行详细的逐步分解,我们揭示了各个阶段,从初始数据加载和准备到最终可视化。理解地理空间可视化技术不仅仅是一项学术练习;它具有深远的现实意义。掌握这些技术可以赋能各个领域的专业人士,从城市规划到房地产,使他们能够做出明智的、数据驱动的决策,这些决策都植根于地理背景。随着城市的发展和世界日益以数据为中心,将数据叠加到地理地图上对于塑造未来的策略和见解将是不可或缺的。
具体来说,从本教程中,您学到了
- 如何利用 Python 的关键库进行地理空间可视化。
- 数据准备和转换在地理空间操作中的关键作用。
- 可视化地理空间数据的有效技术,包括设置颜色渐变和集成底图的细微差别。
您有任何问题吗?请在下面的评论中提出您的问题,我将尽力回答。
Vinod,你好!
我严格按照您的说明操作,但在到达
# 绘制带有销售价格、底图和缓冲凸包作为边框的地图
—-> 3 geo_df.to_crs(epsg=3857).plot(column=’SalePrice’, cmap=’coolwarm’, ax=ax, legend=True,
4 markersize=20)
时,我遇到了
ValueError: Cannot transform naive geometries. Please set a crs on the object first. (错误值:无法转换朴素几何。请首先为对象设置 crs。)
并且显示了一个空白图。
有什么建议吗?
你好,Jose
非常感谢您阅读我的博客并尝试代码。
在您强调的代码块之前,能否请您仔细检查一下您是否执行了上面突出显示的这些行?
# 为 GeoDataFrame 设置 CRS
geo_df.crs = "EPSG:4326"
为了让可视化正常工作,您需要从头到尾执行所有描绘的代码层。
请随时告知您的进展。
此致,
Vinod
这是一个机器学习项目吗?
你好 Mahmood……本教程中的内容是可视化机器学习项目数据的绝佳示例。
你好,Vinod。
我正在使用 Kaggle 上的艾姆斯房价数据集。该数据集不包含房屋的经纬度。它也不像您的数据集那样包含大量房屋。我可以问一下您的数据集是从哪里获得的吗?
诚挚的问候
Nigel
你好 Nigel,
感谢您的联系。我用于类似房地产项目的数据库来自公共房产记录和地理信息服务 (GIS) 数据库的组合。例如,许多美国县提供公共税务评估记录,其中包括经纬度和其他房产详细信息,这些信息通常可以与 OpenStreetMap 或本地 GIS 资源等开源地理数据结合使用。
对于艾姆斯数据集,您可以通过使用 Google Maps API 或 Geopy 等工具将地址或邮政编码(如果可用)与经纬度匹配来考虑使用 GIS 数据对其进行扩充。这可以添加您正在寻找的地理空间组件。
如果您需要有关扩充数据集或方法论的帮助,请告诉我!
诚挚的问候,
Vinod