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

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

[复制链接]

温馨提示

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

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

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

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


1 j. d8 Z1 J5 `# b

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

" C2 M! u; c8 C( ~

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 7 J7 j0 p1 `* W6 L
    + M* W; F4 \0 q1 X* Z, C

conda install Cartopy
1 F4 Q, A) E) S  z9 l0 A. a+ F

/ `6 ?, \: D5 e6 d, b% [

# k* E  q& D0 k  o* c. ?  {2 Z  Q( _! P) @! o; a

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

例1:


  • 8 A% _. E) i* w: P# s- v* R

  • 3 ^3 N: L: Y+ R

  • 6 p8 y" U; d3 |6 p  _# d8 {- {

  • ! W- C% R6 t/ f) u$ Z* f
  • * _2 {# c+ s3 ]7 C& x. t% _* W
  • % q0 C6 j" y: i
    5 T5 ~: s5 T; _# j4 {* c2 _2 J

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
5 W. J8 Y. D" N' m0 S+ _: @

2856b94b0ff5bf4357137987d7c167b3.png


  • / X8 z4 Q" f+ @' u) s9 C# i9 \9 M

  •   x1 ^+ u3 F2 F. _6 j- u+ n
  • $ j: H7 \, e& C8 g

  • . A# D7 A3 z% R5 `( L, o* U

  • * k2 P+ c  F% y4 x1 L/ X$ F+ V" G
  • # k2 U8 w& y# P* O

    3 s- j. _  ]) |2 ^0 O

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
  {# m( x; S, ^9 z

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • - m' P% x) L  D  c: _3 K

  • # b$ e* Z/ W( _: j
  • $ p6 |( H- k% j+ c" `# @0 @' V  H
    5 q% e0 v8 }* Y9 ?

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
, @) C; n) Q4 F5 g


9 d/ e* _0 B- z/ o. G, h9 v( S) X

绘制时间序列图

例:以三角函数为例绘图

  • 2 P$ u  h6 x! v4 J$ P( V

  • ) M1 i* J+ |0 \
  • 8 e0 o! U: k0 f" n
  • 6 D9 D: q; x, u8 C" E) V$ K

  • 8 I7 q1 H, t2 f$ G' s) ~; i, m

  • * c* a1 p8 y" _: ?
  • # G5 G; }" u& t

  • , J7 k$ d4 D" ?7 a9 P

  • ' n! {' ~9 T' m0 B% `9 V+ A. J

  • ; w9 W, \4 \3 G# F/ v

  • 2 [& }3 R; u8 T& ~! m

  • , D8 E3 P( ^  B, W. o+ A
  • / K- i* h- b, d9 _4 z5 f  E+ ]

  • : O2 [; x% R, _. |( E
  • 5 e& a/ v; Z" K' \+ y, _
  • # ~6 \0 L; R! L8 |- o
  • & Y* x: D' Q; ]2 {6 G) @
  • - l. |7 [: X/ O0 U7 \9 N! M

  • 9 L& a! }9 `9 B5 A2 K
  • ( |" d9 y% _# q0 |: s

    / N/ X6 T& q- o: `1 H8 l% 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()( h  t9 V: O! k; m1 b/ |+ ?! d* p

7d0cd3e557628cb00d61b8a5a167f62f.png


) r! y- L3 P% d" b1 ^# y

( G3 H; C$ I* Z$ }) S. J/ S0 y) ?. x
                               
登录/注册后可看大图


7 K: ]% ?2 n% m; z# \" @

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • 6 _( l# p" K  L3 R

  • ; r+ Z4 ]0 f7 a" K

  • : u. \+ Z) d# l% I5 @2 \

  • ( f9 R4 H4 n' ]" M8 t9 w: ~  N/ ^  B

  • ; a2 |* y2 B* Q& _3 q  a! f' y

  • ' J8 V' U. m( ^. A4 b* e
  • " B/ F( u* F, r, A: E

  • ' S6 D0 X$ j/ L: I5 q1 h
  • " v& m! T  K& m* s( Z

  • 8 [% t# ^+ R! Q* j. i3 R
  • . }4 L+ q; Y- M& J9 k% m8 Y5 d
  • # C/ Q8 U- _+ C+ ?

  • . ?4 @. d, G0 _6 G+ J2 s( z, j
  • ) C! P  {! {6 i* S- W. F4 Y. }
  • * `  C. e( a9 {: X; x- E

  •   n3 N- _% X8 A  f/ e+ c

  • 7 W) J1 a! H" b) h& n

  • / y9 B! F$ p# T9 p) b, ~9 B) X

  • , o% }1 o: n: ^+ o8 _. _. K

  • $ p! w1 w9 t- P0 t: P; @
  • 8 d* k0 N9 g" O# o9 e

  • - z5 t, H' P6 g- z
  • 7 H( f6 a$ B; V9 K
    ! a5 V% W7 l. x. K) 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()
' t2 y! |- f5 g1 _# h* f

1da850d5cdd66b7f685d1f819c9f7321.png

  i! j& Y8 O+ ], m1 P& I7 [9 {


5 H# P, C+ q0 Q, W3 E                               
登录/注册后可看大图


# n+ e# I! `8 N1 t

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

回复

举报 使用道具

相关帖子

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