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

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

[复制链接]

温馨提示

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

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

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

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

/ K& |- t; [- Y! W

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

" o- _( }7 l0 U" q4 v

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • 9 C: ^1 g3 O2 a! f$ ?$ ^' @) J

    8 x& U6 v. C6 X8 k$ s4 w8 o

conda install Cartopy  G) L  e6 X) E$ K2 i, g' r

  Q% b6 ~; p! k# {( n
: S% ^1 m) }! @; G. v: r+ J' `$ l

+ t  G; J5 Y( t  q4 }  c# J

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

例1:


  • 5 D) I+ g6 {- K0 x- F
  • ( f- s) ?& v) c0 }' q

  • ! D) V7 E* B8 j/ L) \( u

  • . d: q% V, e" W
  • # q! x. Z" w9 O; i/ m
  • 0 g+ n7 I1 S. _; Q, H& L
    ; X; h0 Z" Y( {

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
: d5 g$ _  h. C& O, r/ b, q3 I

2856b94b0ff5bf4357137987d7c167b3.png



  • 7 e4 e- ^( @) M6 A/ @
  • , T) k) p% n9 B& }! }
  • / [1 {- C, I. F4 x5 ^

  • 9 q% O6 I# A$ W' F; R

  • 8 K6 ]6 L0 i2 A

  • 8 ~/ m" `" e: U% \2 [: a* s5 k- h$ f

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()/ W  A) s9 ]9 c  ?, [. H) U5 [+ k0 d

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • $ b: C' U6 ], O5 v. Z1 P& v! B
  • ; A8 b& H2 n1 I* f
  • ' m$ j0 d' ^+ d+ c
    " m( O1 b, x! l8 u

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
' b+ C% `4 Q1 q


% P( U$ q, k- y' ^) W7 |" ]  }

绘制时间序列图

例:以三角函数为例绘图


  • 1 \% T) z8 z: m1 s* e# c

  • 0 V3 ]( P  r% c6 @- |

  • 3 I) j: M0 h$ L* K; Q
  • + B8 i, w2 M( Q6 X- f

  • 7 [/ E. @- }9 l8 v
  • + y: w8 ~: z. Z2 k% M( {

  • 4 `- N( a/ d" q( J1 e) }. t1 v
  • $ K* Z' M( U% G3 ^) t' u
  • 9 U$ x/ M: a! ^9 K& s% U
  • 4 X- u" F( p7 X+ J6 P

  • ' u% Z9 U1 y; A1 _6 M
  • 0 k7 i* E  Y5 l- j% @4 o
  • 9 n# z. U2 `- t! r- {7 O
  • 5 G  {5 e6 O8 W4 x& E3 e

  • 4 z) I: ^$ ~7 z- v0 m1 [& p

  • 9 P* Z8 ^/ M$ `5 C7 u0 Q
  • . ]. `, m) i+ W7 |7 p/ }2 V

  • 1 c8 J# S1 n- o# e9 E
  • 1 P+ X* `( L9 n

  • $ t  I1 P) H8 x! S; R# u- ?, ^3 o( Z  f6 g% S' s' a

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()' g( H) K) t  e

7d0cd3e557628cb00d61b8a5a167f62f.png

4 q0 v" M' C' _. k

; B) q8 h) h4 M
                               
登录/注册后可看大图


4 w1 Q4 e+ O. l# Q) \

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • ! g5 `* t) q$ @6 v3 |& \! X, i: M7 h

  • 4 N0 {& @8 ^! _6 g. H8 U2 v+ D
  • 8 n" \( ?8 x: |) x8 K
  • ! _' a% z1 H. H. G1 C  o* X
  • ! q: {7 ^( N& _/ Y2 V* z

  • % q- \0 c% h; {
  • ) b. r2 O# N" e

  • + q. M: e( S- Z
  • 1 o2 j1 O1 \# Q+ d  V5 S
  • 9 j1 S: ^. o5 f  ^/ V/ h4 B

  • 6 ?2 D: O6 f1 k9 b, U) x& W) ]

  • : Q/ m. {2 i7 o7 N

  • * P# L0 E1 c. Z5 \  ~2 Q2 R+ w
  • . Q) b' [- P' l) D

  • 9 \* _1 ~! _7 }. O- g
  • ( }) y$ g9 k# h0 J6 |
  • 5 A) A8 @, a, M  w

  • 2 t* S% j+ |8 _. b0 B
  • 5 J8 Y4 I4 m0 t) M% y

  • , y: @+ E- @) c5 ~, z+ `8 B% N# ]

  • ) X. O9 L9 n- u$ m; M
  • $ l% t8 _/ a; ^  B! |& |) e# m

  • 6 c* u9 r5 n6 W+ a& {
    9 W+ a6 {; u: e( m, g% ]

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()
: L! D5 E! J, ^$ `1 |8 C4 F. ~

1da850d5cdd66b7f685d1f819c9f7321.png

5 x- Y0 N- h6 a, z* ?5 g


# ~: c# ~" C9 P% _; p. \                               
登录/注册后可看大图

& ?, g) c0 J& n' U9 R8 y. p2 S

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

回复

举报 使用道具

相关帖子

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