|
Cartopy是一个Python包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。Cartopy利用了强大的PROJ.4、NumPy和Shapely库,并在Matplotlib之上构建了一个编程接口,用于创建发布质量的地图。cartopy的主要特点是面向对象的投影定义,以及在投影之间转换点、线、向量、多边形和图像的能力。
! f2 Y5 \+ o% L! O7 Z& o/ \绘制简单地图 Cartopy公开了一个接口,可以使用matplotlib轻松创建地图。创建基本地图非常简单,只需告诉Matplotlib使用特定的地图投影,然后在轴上添加一些海岸线: 1. 使用anaconda安装Cartopy库: conda install Cartopy3 U$ Y: e! @, u
J6 O$ D- C6 g# x" C2. 工作在多图形(figures)和多坐标系(axes) MATLAB和pyplot都有当前图形(figure)和当前坐标系(axes)的概念。所有的绘图命令都是应用于当前坐标系的。gca()和gcf()(get current axes/figures)分别获取当前axes和figures的对象。通常,你不用担心这些,因为他们都在幕后被保存了,下面是一个例子,创建了两个子绘图区域(subplot): 例1:绘制两个子图区域
. w$ |* G) L$ M4 T% I2 Y9 y
#1-7行同前面代码fig = plt.figure(figsize=(10, 5))ax1, ax2 = fig.subplots(1, 2) #横向创建两个一行两列的子绘图区域# 上面两行代码可以合并为一行,如下# fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))ax1.plot(x, y1, label='$sinx$')ax1.plot(x, y2, label='$cosx$')ax1.legend(loc='upper right')ax1.set_xlim(-2 * np.pi - 1, 2 * np.pi + 3)ax1.set_xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi])ax1.set_xticklabels(['$-2\pi$', '$-\pi$', '$0$', '$\pi$', '$2\pi$'])ax1.set_title('三角-函数')ax1.set_xlabel('横坐标')ax1.set_ylabel('纵坐标')ax1.axhline(y=0, c='black')ax1.axvline(x=0, c='black')# 设置父标题(画布标题)fig.suptitle("Axes绘图示例")
% g" }' }1 D- D7 T: k! l, z7 ^: ~
注:fig.subplots(numrows, numcols):将绘图区域划分为numrows行和numcols列个子绘图区域。 figure对象是一个顶级容器,用来放置、布局子绘图组件,可以进一步将figure划分多个子区域,这就像一个文件柜被划分为多个格子或抽屉一样。 Axes是Figure子容器中最重要的一个子容器。Axes是一个矩形区域,这个矩形是基于figure坐标系统定义的。Axes也是matplotlib框架中一个重要的类对象,但首先要把它理解为figure中的一个子矩形区域。
要向figure中添加axes子区域,有三个途径: (1)使用figure的add_axes()方法; (2)使用figure的add_subplot()方法; (3)创建一个Axes对象实例,再将这个实例添加到figure中。 ; t2 A% H) z+ i% g/ I% l
. y/ k5 f# J' Q* t% ^/ h* w$ M5 N
& T a# q# f. u7 T+ ] g应用与绘制气象地图两个子区域: 以某地1979-2019年平均气温为例绘制两个站点气温时间序列的子区域图: - - j( |: Y" q- q1 M0 b8 r! |
import numpy as npimport matplotlib.pyplot as pltimport pandas as pdplt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题#读取某地1979-2019年年平均气温数据共40年data = pd.read_csv("annual tem.txt", skiprows=1, sep='\s+', header=None, names=['year', 'sta1', 'sta2'])print(data)x = data.yeary1 = data.sta1y2 = data.sta2fig = plt.figure(figsize=(10, 5))ax1, ax2 = fig.subplots(1, 2) #横向创建两个一行两列的子绘图区域# 上面两行代码可以合并为一行,如下# fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))ax1.plot(x, y1, 'r', label='$sta1$')ax2.plot(x, y2, 'b', label='$sta2$')ax1.legend(loc='upper left')ax2.legend(loc='upper left')ax1.set_title('station1 annual mean temperature')ax1.set_xlabel('time(year)')ax1.set_ylabel('tem(℃)')ax2.set_title('station2 annual mean temperature')ax2.set_xlabel('time(year)')ax2.set_ylabel('tem(℃)')# 设置父标题(画布标题)fig.suptitle("1979-2019 mean temperature")plt.show()
2 ^4 ~) z+ r- g+ m1 B3 X
|