一、介绍
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等。