[Python] 【气候软件】Python5:绘制气象资料的多区域子图

[复制链接]

Cartopy是一个Python包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。Cartopy利用了强大的PROJ.4、NumPy和Shapely库,并在Matplotlib之上构建了一个编程接口,用于创建发布质量的地图。cartopy的主要特点是面向对象的投影定义,以及在投影之间转换点、线、向量、多边形和图像的能力。


9 k) {9 D  V; y3 A1 o+ z

绘制简单地图

Cartopy公开了一个接口,可以使用matplotlib轻松创建地图。创建基本地图非常简单,只需告诉Matplotlib使用特定的地图投影,然后在轴上添加一些海岸线:

1. 使用anaconda安装Cartopy库:


  • , Y9 L9 K6 s5 O# e" }3 f

conda install Cartopy
- b; B: N" w' z  ^2 V( B" w

! g% ]: t+ |5 |

2.  工作在多图形(figures)和多坐标系(axes)

MATLAB和pyplot都有当前图形(figure)和当前坐标系(axes)的概念。所有的绘图命令都是应用于当前坐标系的。gca()和gcf()(get current axes/figures)分别获取当前axes和figures的对象。通常,你不用担心这些,因为他们都在幕后被保存了,下面是一个例子,创建了两个子绘图区域(subplot):

例1:绘制两个子图区域

  • 7 }$ |% L6 F/ {+ h

#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绘图示例")  z: M" O# n4 I) j

5caf6d4695cbbe884d6157fc5194e339.png

注: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中。

    * O' C: W: s& c+ m. c/ z( p
$ E! k- t! s  s7 M* _$ @- j
7 G9 N& K# O: K& \. |0 o. y: o

* s- `* u/ J0 ~1 m' t; h) S

应用与绘制气象地图两个子区域:

以某地1979-2019年平均气温为例绘制两个站点气温时间序列的子区域图:

  • 1 b/ {! t; L+ s. O, S* h& h) ^

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()# ?, V6 }2 H+ `( M3 J" e& R

973a7f4a281da6cd521e13692bd059f4.png

回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
有风
活跃在2022-10-29
快速回复 返回顶部 返回列表