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

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

[复制链接]

温馨提示

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

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

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

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

& N' d3 C# L. d0 _' L) F6 i

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

  x1 N7 Q* a7 t5 u1 \

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • ' k9 l' F' s) z' w: H( }. W6 C8 H
    # V: b) J2 l% \$ T: z

conda install Cartopy
& ~& k9 N7 e- u0 ~

- L) H; L4 v4 Y
+ L* b( e' O% I, t* a  d9 w

7 @0 @, X" g/ a( `* N- a) ~

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

例1:


  • 8 G* u) W7 v7 H: q8 D8 t7 m

  • 7 m( n. S: ?$ l9 f" L% [' W( J

  • ; J# v0 t/ W8 }! [
  • : x' l4 o/ o) s% L

  • ' T+ O  w$ V, P

  • , X3 C( L1 x: ^; S( B- _; {, K
    1 C6 q+ N1 ~) E: h( Y' _, c2 d" C

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()) K2 S/ L' \5 A: h$ A

2856b94b0ff5bf4357137987d7c167b3.png


  • # `7 Q8 f, d9 m% b

  • 2 {; P1 u( a) F  G( V

  • $ l1 K" J9 K4 W) o
  • % a  M( f( [( x) i7 V. S

  • * g+ k3 j* Y; ]: r5 Z2 R
  • 8 c/ n* D7 T" p; L5 n; \3 h1 q# a
    0 |; S8 m# S! R. G" m) X& x) p

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
2 P* O, T* S0 X8 k% g' t0 s5 g. T

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • " `* |1 N! L9 j% r/ @5 h& H

  • 6 ~# r2 W+ V6 i  M7 z

  • 2 y, Y4 }- Q3 o; N0 Q& {- r' P& h9 b' ], a/ Y

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
0 w# P9 A( ~) p8 q


4 Y$ O1 m4 {  {$ C

绘制时间序列图

例:以三角函数为例绘图


  • 6 l, z7 n( T0 w3 c  `: j' j3 u' z, `
  • % _4 P, |' J+ j

  • + }; ~. }$ b) ?8 j  o4 m
  • 6 `7 l" w  u  ~% H+ |
  • 9 t; G! K8 M' m- _8 b  C

  • . B1 i* X( V9 S8 Z; m$ \/ M% ^' r

  • 0 l! A' ~) x& K% f
  • ) h+ d$ ]4 B* ?) I5 z/ M

  • ( P  x. N  o( C6 N, i1 t

  • 9 X) ~2 ?  }! s2 q' U

  • ) R6 t( j: j# l; O2 S8 Z: P: Y
  • $ B. ~7 m6 N4 f2 Q# u5 p# V
  • # o/ l, O/ f: k% F3 P( v
  • 7 U; _. I( E3 p/ J: M
  •   H% r) _' J; m
  • ! I& k: K8 v, F4 k9 C

  • $ P5 ]' y- x3 h! e# J, q
  • 1 y% x! r5 M* a% ?3 M) D
  • - l; L( a  q. i2 ?4 Y' l& k

  • - s2 H; n" b7 @; n. x' }% {+ D# ]% N, Z* ]7 I/ r1 [/ J

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()
( S: {: R; s% Y( q* f; F1 B

7d0cd3e557628cb00d61b8a5a167f62f.png


. d; L7 ~$ ^+ z# q' j0 L


" Z2 i6 g7 r* K                               
登录/注册后可看大图

  N" i& {2 a7 h- F

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • & N  t3 y( d. ?+ O
  • % O( z; \1 ~. c; j/ x) ^) r

  • - v+ V' d/ ^( o- z. T6 |1 ]& K
  • 0 g1 w  V( L7 t) {+ A% T1 X/ V
  • & `5 y+ x6 ]  j$ e1 s% E4 V

  • - Q3 H; M( B8 L; ~( c# \

  • # T/ ~6 o  ?4 u% Z5 C& p# H7 j' }
  • / S  m% |1 J8 k# i9 ?9 w

  • $ A7 Y2 C  R1 |/ x5 h% j

  • 5 ]! A2 o! Q9 o/ L

  • 8 O  x' P, S. K. A$ Q
  • ! X' v% ~. w$ t* x! M

  • ( W* S: Y3 k' u# l" ?( I

  • 7 x2 b) k4 J; n

  • ) ~/ S) ?4 _, i" R, C# G5 j# p8 F

  • " w& B* g8 x+ {( a
  • 6 ?  k1 @& V  d  O9 A4 e# c. u& {

  • 4 I+ a9 u( ], ?$ J( _. U8 e; {
  • 6 t5 y% b3 r. t( |* t- H

  • & ~$ a  N( r: v. L2 i1 H
  • " v) w1 @) n: g: c

  • ( Q, H( g  _) Q) D# @- V( @
  • + e  T3 F* B' ~* e. w, F# q

    8 r* J8 z" _, p; ]

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()* O' j$ g7 D) }, k. X+ |

1da850d5cdd66b7f685d1f819c9f7321.png

2 E; c( b, d3 @+ c, C! G2 @) U

- A7 H% y, P: I4 B0 a6 w3 o" \6 K( L1 N
                               
登录/注册后可看大图

2 X& g3 j# X6 @8 E4 k

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

回复

举报 使用道具

相关帖子

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