您的位置:

使用Python Cartopy进行地图绘制

一、介绍

Python Cartopy是一个开源的Python库,继承了matplotlib的绘图风格,同时提供了更多丰富的地图投影和数据转换工具,可以帮助我们绘制地图、天气图等地理信息可视化的图表。

在现代社会,地图数据已经成为企业、政府和学术研究的重要基础数据资源。使用Python Cartopy可以让我们更方便地处理和绘制地理信息数据,同时还提供了大量的地图投影方式和地理坐标系,使得我们能够更加细致地展现全球和局部的地理数据。

二、绘制静态地图

1.准备工作

在使用Python Cartopy之前,我们需要先安装Cartopy模块。可以通过pip install cartopy命令来安装。

!pip install cartopy

同时,还需要导入相关的Python模块:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

2.绘制地图

接下来,我们可以绘制一个简单的世界地图。代码如下:

fig = plt.figure(figsize=(10,5)) #创建画布
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) #创建地图子图
ax.coastlines() #添加海岸线
plt.show()

在该代码中,我们首先创建了一个大小为10×5的画布,并在其中创建了一个地图子图。projection参数可以指定地图的投影方式,这里我们使用了等面积Cylindrical投影方式(ccrs.PlateCarree())。

随后,我们使用了ax.coastlines()方法添加了海岸线,并通过plt.show()显示了地图。

运行上述代码,可以绘制出如下的简单地图:

3.添加地图元素

除了海岸线外,我们还可以在地图上添加其他的元素,例如国家和城市的名称。代码如下:

fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
ax.coastlines()
ax.set_title('World Map', fontsize=16) #设置地图标题
ax.text(-168, -57, 'New Zealand', transform=ccrs.PlateCarree()) #添加新西兰的文本标注
ax.text(-66, 10, 'Brazil', transform=ccrs.PlateCarree()) #添加巴西的文本标注
plt.show()

在该代码中,我们使用了ax.set_title()来设置地图的标题,并通过ax.text()方法在地图上添加了新西兰和巴西的文本标注。

运行上述代码,可以绘制出如下的地图:

4.自定义地图

在绘制地图时,还可以通过更改地图的投影、颜色等属性来实现更为自定义的需求。下面是一个例子,展示如何绘制自定义颜色、自定义维度和自定义投影的地图。

fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertAzimuthalEqualArea(central_latitude=55, central_longitude=10)) #更改投影方式
ax.set_extent([-10, 100, 30, 80], crs=ccrs.PlateCarree()) #更改地图范围
ax.add_feature(cartopy.feature.OCEAN, facecolor='lightblue') #更改海洋颜色
ax.add_feature(cartopy.feature.LAND, facecolor='beige') #更改陆地颜色
ax.add_feature(cartopy.feature.COASTLINE, linewidth=0.5) #更改海岸线粗细
plt.show()

在该代码中,我们使用了LambertAzimuthalEqualArea投影方式,同时使用set_extent()方法更改了地图的范围。

在地图上,我们使用了add_feature()方法来添加陆地、海洋和海岸线的属性,并通过facecolor参数来更改颜色。

运行上述代码,可以绘制出如下的自定义地图:

三、绘制动态地图

1.准备工作

Python Cartopy不仅可以绘制静态地图,还可以绘制动态地图。在使用Python Cartopy绘制动态地图之前,我们需要导入更多的Python模块,以及四个不同的数据文件mapData、latData、lonData、tempData。这些数据文件包含了每个时刻每个位置的温度数据和经纬度数据。

import pandas as pd
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import numpy as np

csv_file = 'https://raw.githubusercontent.com/plotly/datasets/master/2015_06_30_realtime_global_temperatures.csv'
df = pd.read_csv(csv_file)
mapData = df.groupby(["lat","lon"]).mean()["surface temperature (C)"].reset_index()
latData = np.array(mapData["lat"])
lonData = np.array(mapData["lon"])
tempData = np.array(mapData["surface temperature (C)"])

2.绘制动态地图

接下来,我们可以绘制动态地图。代码如下:

for i in range(len(latData)):
    fig = plt.figure(figsize=(8,6))
    ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
    ax.set_title("Temperature across the world")
    ax.coastlines()
    ax.stock_img()
    ax.gridlines()
    ax.scatter(lonData[:i], latData[:i], marker="o", color="r", s=tempData[:i]*1000, alpha=0.4, transform=ccrs.PlateCarree())
    plt.show()

在该代码中,我们首先通过for循环,遍历了所有的经纬度点,并在每个时刻绘制了该时刻的温度数据点。

在图表中,我们使用了scatter()方法来绘制温度数据点。s参数用于设置绘制点的大小,alpha参数用于设置点的透明度。

运行上述代码,可以得到如下的动态地图(需在jupyter notebook或者本地python环境中运行):

2.总结

Python Cartopy是一个非常方便的工具,可以帮助我们绘制静态和动态的地图。在使用该工具时,我们需要先了解基本的Python和地理信息学知识,同时学会使用相关的Python模块,例如pandas、matplotlib和numpy等。