收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

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

[复制链接]

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

9 N  z9 u* l& t4 ?( ?  D3 a% ^6 k3 w

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • # T$ t2 r/ V) J8 T' \

conda install Cartopy. t( ?% G% L  j4 D4 D  d, }. E


% k2 f$ b$ M1 y# s0 J  [2 [8 B0 e

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

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

例1:绘制两个子图区域

  • 0 V  q8 H7 ?: S3 f9 V

#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绘图示例")
! R0 |/ t3 O1 b" H

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 H% F1 o; C! ]+ n
4 I' [+ t" w1 E+ ]: @

* w2 ~1 `9 S6 w8 D" u$ W0 l7 G* }# w# R+ F+ [

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

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

  • # F0 g; O. n8 I7 U9 @- P* J2 A# c

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()
) P. `6 {0 x  V; L: \  C

973a7f4a281da6cd521e13692bd059f4.png

回复

举报 使用道具

相关帖子

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