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

[复制链接]

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

. [# b6 r; x3 D. e/ k

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 8 u1 M  N- b5 n6 g+ w

conda install Cartopy' }6 @+ d$ a$ \2 a( }( C

$ t  y# E# T. N, x

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

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

例1:绘制两个子图区域


  • % r; r" j5 N3 z% T- }

#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绘图示例")
2 s" k0 l' U( _9 C

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


    6 ^8 t, y6 i" w
6 R. ~4 Z* G, s8 y6 x6 B6 y) L

. J* ~# r, D/ P% n* d* R$ f2 D) ]5 g8 l% }3 c

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

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

  •   C5 W3 C" P1 Y' }" k7 g

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()! G: R4 n7 {6 N2 \) l& P

973a7f4a281da6cd521e13692bd059f4.png

回复

举报 使用道具

相关帖子

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