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

[Python] Python4:Cartopy和matplotlib包绘制地图和时间序列图

[复制链接]

温馨提示

(1)本号分享的有关python的经验方法都是基于anaconda下载的库包(conda install 库包名 或 cmd 命令 pip install 库报名),以及使用anaconda里的spyder(python3.8)编辑和运行代码。

(2)所有的代码都是经过了spyder(python3.8)正常运行得出结果的,可以放心使用,也欢迎交流和讨论。

(3)使用的软件以及不同版本,都有可能会导致代码运用出现问题(不代表分享的代码有问题或是错误的。),关于不同版本运行本号分享的代码出现问题,请自行网上搜索解决办法解决。

(4)如有转载或分享请注明出处,尊重本号版权和辛劳,谢谢!如有侵权敬请联系删除。


5 i" y& e2 Q# z$ O

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

4 ?% ~- ]6 s/ S' `. |9 W

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • ( c7 r9 g* |7 w" e5 j( T
    ! K- C, v0 \4 v  u* t5 _. V

conda install Cartopy
8 p3 R2 }" I( ^& p9 `


. d( |# T4 U% a' z4 T3 ~' {# }6 i5 l1 Y3 `& D  u

* L4 a" n* E* c! w) z6 G  p$ s0 ~

2. 使用matplotlib.pyplot(plt)绘图:

例1:

  • 3 p  u$ z$ a: u4 T
  • 2 q5 L4 Y3 d# c2 o( j5 W9 O( o

  • ( Y( m6 g) t' L

  • 8 A$ U+ L' O& E0 Q

  • . W, _& c4 x. G$ p% N
  • - p5 X( C4 Z( y" K+ I
      h( P; c# P9 B% ~' U0 ?" f

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()7 A; m8 ^1 ~8 d: ^

2856b94b0ff5bf4357137987d7c167b3.png



  • ' V( g5 n1 t! `) e' n' ~- y9 |: Z/ k4 U

  • ( @0 s% K; u) w3 n/ n, M7 w
  • ) \& S! X6 Y6 }  k2 R! W+ t' F9 n

  • ; f' s1 N; w9 y5 g/ T
  • 5 ?; W. \; Q4 v+ @

  • - h; x* W# ^9 D9 y; v5 B
      H- b* N# e3 \

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
( z8 `( ~  v7 R: M

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 5 T/ v  C7 Z( X
  • ' o% d' P. z/ l0 E: l
  • ( p7 I) g# F3 y% k

      X* \! b$ Y" e8 T) |

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片6 q! C! x& M3 E: ^' h2 l) D

6 G/ H' [: I( j8 ?3 Z* f

绘制时间序列图

例:以三角函数为例绘图


  •   @% R+ ]$ j6 L1 S. X

  • - }- @$ ]3 d4 i  J& q: q0 v
  • * i- M" g9 ^# W7 j
  • ; o9 m! ^8 O9 g: K* F9 R

  • ; y2 i1 K$ V+ D
  • & D; q" a) R% ?5 u. q' n
  • 8 X3 k3 L2 g" u9 Y6 f
  • * G2 h, A0 D2 t  C/ U4 j6 M7 D

  • 5 y- P! M- o7 B; T, `) X
  • : p0 s  w8 {2 d: S/ e& r  b- v% m8 T

  • 5 e& o# ^: y- v! l. J  F# D

  • % v3 L9 l  Y6 T+ q4 H

  • 8 D$ `* x4 R6 M
  • ' o5 d3 s) m5 @( z
  • # B& x% @' n/ B

  • ! f6 `) j/ U' ]8 D  S8 n- j

  • 3 |* e, D: _0 ], M& `' ~

  • $ {6 Z- Z" p8 J  q3 t" j1 b
  • $ G4 Q4 D% l- p9 N0 e6 q* l
  • - g2 k8 K( }% v+ a+ o3 G
    ( `8 z5 S: i3 f3 U

import numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置-黑体plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题x = np.arange(-2*np.pi, 2*np.pi, 0.01)  #设值y1 = np.sin(x)y2 = np.cos(x)plt.figure(figsize=(10, 7))  #画布大小plt.plot(x, y1, label='$sinx$')  #绘制sin曲线plt.plot(x, y2, label='$cosx$')  #绘制cos曲线plt.legend(loc='upper right')  #图例plt.xlim(-2*np.pi-1, 2*np.pi+3)plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi], ['$-2\pi$', '$-\pi$', '$0$', '$\pi$', '$2\pi$'])plt.title('三角-函数')plt.xlabel('横坐标')plt.ylabel('纵坐标')plt.axhline(y=0, c='black')plt.show()
; Q' c! v2 ], H; z* ?1 a& ]8 i

7d0cd3e557628cb00d61b8a5a167f62f.png

- x* D2 y$ f; q( y# e

* ]4 C6 \( S, e& C# G7 I
                               
登录/注册后可看大图


" ~# r6 s. J  x. E; k- y

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • $ \, `/ c- f$ T% B
  • . r( F& F' T$ V. X9 a- L2 R

  • " G, O4 t* C& b( E
  • ! t6 |; h/ o0 l9 G* _3 K
  • " m, c9 C9 d) T# ]! H, @( p2 W6 j

  • . p( w9 U5 x" i2 I5 G/ z# P* Z
  • ; g9 J; Y* A$ d* y
  • 2 ~! _8 A1 _( Z' F
  • . e* H/ ]4 h, y. N. l- b7 P

  • 6 f8 O& I! j4 c6 Y: E" m( z3 F) ^
  • 7 s/ a1 @) N  x7 B. y  y
  • ! H0 ~, R5 x0 f6 v+ v! x3 w) P
  • 1 O, }( X4 A4 u3 B5 @- _
  • , b3 x9 V6 _4 p5 X* d: i* o- Y

  • ! u3 E1 Y7 u4 C) {2 E6 R  N

  • ( G2 O4 W: }6 h6 J; j+ E
  • 4 x3 g3 E6 l) Z! J6 f* o
  • 9 U" w% d3 t# A) Z+ a5 t

  • ; E9 x* s0 t8 [* g- b7 x
  • " ]! K, G6 h3 h& |2 E: ~( _
  • ' p+ f/ K" {; z, S

  • . g/ O3 i6 z* [6 R' ~

  • % k: ?8 i1 o5 O& n# Z3 K3 u" w$ L% E! h- N

import pandas as pdimport matplotlib.pyplot as pltplt.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.sta2plt.figure(figsize=(10, 7))  #画布大小plt.plot(x, y1, 'r',  label='$sta1$')  #绘制sin曲线plt.plot(x, y2, 'b', label='$sta2$')  #绘制cos曲线plt.legend(loc='upper left')  #图例plt.title('1979-2019 annual mean temperature')plt.xlabel('year')plt.ylabel('tem')plt.show()9 R7 Z1 _, ^, ], T5 R

1da850d5cdd66b7f685d1f819c9f7321.png

7 l+ @, |& h! V


* _% e0 M8 S6 a  ~6 ^# ^% B$ E) e                               
登录/注册后可看大图


) A1 h  ~4 j$ _& F/ \8 F6 M

使用matplotlib.pyplot(plt)进行绘图时,直接使用plt里的函数:使用面向对象的方法,先产生一个Axes对象,再对此对象进行操作,实现绘图。

回复

举报 使用道具

相关帖子

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