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

[复制链接]

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

. |8 `2 y; U6 n( V

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • ) D; q6 P6 X% i; @) V/ J

conda install Cartopy
8 G: }/ n6 V; h; K1 H* D

( I/ X4 S% f' }  r5 z4 c* L

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

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

例1:绘制两个子图区域


  • ' m  r+ i5 R! |$ o0 z  K: W$ q

#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绘图示例")
' S0 N: j$ ~$ n( j3 u

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

      a) C" t, S8 U7 r* l: d

: I4 v+ ?, S( J
/ l, ~. c$ d; p8 x6 m
) ]5 W& d, J6 H4 \. _

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

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

  • 8 X. K& \0 |: E

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()# }8 q# i' S  R) t; W4 p

973a7f4a281da6cd521e13692bd059f4.png

回复

举报 使用道具

相关帖子

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