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

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

[复制链接]

温馨提示

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

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

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

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

+ V; U* S( ], x  u2 _: o

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

# n, \: [5 ~. L+ C; m6 }4 O

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • : n$ g( s' M& l: Q% \. M1 q- r1 K2 h) Z6 t- A8 `+ ~. G; Q+ a

conda install Cartopy$ Y$ H$ K8 J7 k9 C! `. s3 n+ h

# k1 C- I0 E$ W# ~

& P. V. @* O6 ?' C& [  c
  O5 h3 Z( y$ a6 @4 Y

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

例1:

  • # J+ y; [* ]+ _8 T( p
  • . c4 x! D$ ]5 O9 ?+ X* J

  • , C+ j/ g' ]" a
  • % z* f6 J! Y6 V
  • , c+ X9 T) m7 O/ u# o! c
  • 6 }5 l; @) ]5 F: H' U3 N
    $ o* `+ N1 k4 b. |' F/ B) M: r

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()- B0 r* d1 M' K. _: R' A' K

2856b94b0ff5bf4357137987d7c167b3.png



  • 7 }' ?4 Y6 |! f5 ^9 X2 {0 L
  • . d% d6 c, ?  u5 C2 I- j; U" A; a

  • * X1 K2 c% I4 @' n& q& {
  • $ a7 K1 A3 T5 X/ _. n! B' u, G
  • - Q" P- X: x5 r9 }2 W* W

  • 6 ~1 x7 b: N( p+ |
    # C7 T* u# Z; n8 c0 z

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()2 a: y1 T9 Y2 K% x2 q

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • # v0 x- u2 |; l5 q# }3 z

  • ) a: d' P4 f6 z+ s" E8 {8 ^. q. I& s
  • 7 R) P! J* V* f& M6 ~( w: I6 e
    . m% n1 x& |' E- z$ }, e3 V

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片  W/ v1 C' m& S6 f/ y; R


3 f* ]  z6 H. G8 k8 ~

绘制时间序列图

例:以三角函数为例绘图

  • 0 t- X* R+ v1 z: c" a2 ~  S. O
  • 0 ^5 ~- k% }4 |2 D3 i% L" \
  •   G! O' {0 V( e( T, P" h
  • ! }, A; R$ M9 H
  • ) ]2 T2 }) u- K; P

  • # @9 X: p7 `" E5 }3 `
  • # a1 o& E, N* H- d, X
  • & k% [0 F( q, }

  • . X. o$ P# r$ v2 F2 f; L

  • $ f4 ^# ?0 H0 S; ~' I- p# o* M

  • 1 S; {+ U& S" w: J: j8 \: o
  • ' }2 U, u9 ]* E& x7 ~, p& L8 s

  • 3 ^7 T4 y* b# a) v4 S# C
  • 6 C$ E3 q4 z' |9 N+ ?, ~

  • : a1 B; L9 L5 P

  • : y% z- p  `- y% Q* T3 L

  • / Y5 j7 O3 B# F4 _& |

  • ' k8 K: y4 F$ y/ V, r! m4 g3 u

  • 0 E# u: V7 X5 I" p- c# C3 x+ |
  • 2 [1 H! I2 \  c2 Z0 W
    - d/ p) O6 b7 A" g, h- [) g

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()
4 X0 L) w. V7 j* k) G

7d0cd3e557628cb00d61b8a5a167f62f.png


+ y8 h! G( W5 e$ C! @9 n3 s/ _

# B6 T. n* j, w3 @
                               
登录/注册后可看大图

% m/ }- \" A9 J0 u9 C& i. C( C5 m; R

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • & O) I1 b/ X! S: d' o! G- L

  • " G" D  i" m# T8 a

  • 9 z" e6 y, a6 z7 R  g# Z
  • % n0 x8 n" |* J: W
  • ' C  v/ ]" a. I2 ]
  • ! U0 n  O) J6 A' O* V% Y) [5 C5 ]
  • ( c& l+ I9 R: C7 ^8 c. o# B) i

  • 1 f7 {8 w6 I5 z6 R8 Q- }# J5 j

  • ( ^  b( S1 W2 ~# o

  • 9 |2 ]8 b1 W( }0 x5 W; Y
  • $ R$ {* I& K+ f% Q: C9 Z, z  }
  • # v0 v% [2 R9 u+ D" l* }

  • 3 L% C. o! r7 c% x( h) Q

  • ) h9 Q+ f4 G/ j: _; Q. c

  • 2 G% w) ~5 e. M& L

  • * N& i: G+ t4 W# y  L
  • $ O0 x9 V! @) M; S! M( X# s

  • 6 H6 B) M' z1 G( z
  • + w' B. M- r6 [

  • " J; ^6 b, p& P% _: T# S" g" U

  • ; s" r; I  K& I2 b( E; z  r4 D

  • ' E3 N% D* b) T( z( N
  • 8 t# Z9 E9 @6 n! ~: I+ D

    : V0 a& r' |; l/ c

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()
1 P  P0 X* i2 p  L; A

1da850d5cdd66b7f685d1f819c9f7321.png

) q" Z4 }" e2 C8 c" D+ I' n$ G) n

+ E% Z# X; V, M' Q+ ?, `  ]3 \( r
                               
登录/注册后可看大图


+ g& g4 y, Q, P* m

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

回复

举报 使用道具

相关帖子

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