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

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

[复制链接]

温馨提示

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

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

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

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

; [: b5 W# M8 R

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

) G7 p4 g5 {) o" H: F3 i

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • . ]* U' m- b5 F6 @5 k/ y& \# ^( ~, U

conda install Cartopy
8 d  ~- Z$ U% U* [8 Q/ f

% Z; ~# X. ~& A5 S6 t% K
' ^* z+ Y% a6 @. F7 V

8 I1 T2 Y, E8 P/ t" o3 Z

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

例1:


  • # K5 w# n9 `) v+ Q
  • " j* E( z" Y+ j( t! U

  • / |4 e! ?2 `# u. {! K$ O' s, `
  • " p5 A4 R7 d- g# Z
  • : \9 c' ~! p0 G
  • * O: G8 [2 h1 n) @6 U, G

    ( q9 @0 c# |: C, V2 |& r  @* g

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
- |% O& f% n; Y3 y  K

2856b94b0ff5bf4357137987d7c167b3.png



  • % V' \/ a9 c* M8 `- n! P5 f

  • ! d$ A, M' T- @* |

  • 8 R" `2 Q9 e) r& f0 B- ?9 w" ]

  • ( A+ u4 L( C+ t7 R5 S) \" T

  • & R$ y, [2 D$ `4 {
  • ( L% W0 d7 l% [+ R9 F/ G' m
    . e1 n: G+ j, l% V

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
4 y) O5 d4 [4 |) Q7 C( r

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • , [! D( c* L1 K2 U6 k

  • ' V6 L( L) k) k) b7 A+ W7 l; T

  • 0 ~2 L0 I& x" j& U+ ?9 l% r. u) O' z0 _4 [9 H

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片" d- f( {, o( i) b

9 b0 A# q5 |! n* T

绘制时间序列图

例:以三角函数为例绘图

  • 8 S. h# l* C  {+ l
  • $ [& A- W, [1 O* A

  • " Z- V5 W, Q2 \( i

  • ! }; S  K" Z: T

  • # b( b' I, a5 Q) v1 X

  • 1 d4 E; P+ w; v5 m
  • # o" X- r7 B4 `, M, O1 \# Q

  • 8 @  |6 f3 C. z$ d% d) i
  • 3 W7 l& q; X: d, m7 ?5 M- m  Q

  • 1 |- N. \! r+ i8 w+ `! Q- ]; I

  • # y) }! M8 Y  o

  • / y" r2 ^% Q* Z6 y7 A4 w
  • 8 y% G$ i+ u8 ?2 S

  • 5 E# W) q/ r' r& |% H

  • : D3 s7 y+ T; y
  • ) g. t6 w8 v$ A, p  I+ t
  • ) i) k% u/ G4 L% i4 \' y) g

  •   l' T. ^. y! q3 C7 r* n" b
  • 4 T; Z. X( Y" x  J' x
  • 6 ?) i6 j! x# {$ n

    8 x0 v! `6 b9 W

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  F; G( ]) J& t

7d0cd3e557628cb00d61b8a5a167f62f.png

  _# T! ]9 R% O# I5 O" u/ Y3 V

' p& _6 y# m/ c( w4 t
                               
登录/注册后可看大图


6 B! [: G# G' f9 W2 V- M

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • : r; q8 M; k) w& }9 _0 _
  • 4 R3 z# O( }0 l+ k: W6 D

  • 7 l) G, M# A  }( U% J* }

  • ' j, v4 ^# n4 r5 J2 K1 Q
  • 5 ?" n5 |3 ?1 y* T

  • % ?& D/ P# e! ]; X8 M

  • 7 f( d7 D6 G+ g) ]: ]

  • 5 \0 g! [! E" \
  • + K3 F. ^' t( t) }- U8 u
  • 2 j( k( o: i7 v1 ]. L8 E2 K- x

  • $ ?7 Y1 Q+ K8 i) P# H9 d

  • 4 P' O- \9 x: z3 p
  • 8 D$ x2 P2 A% K, J9 d

  • 9 U- Y4 V/ h% \% c' t$ L) A
  • + c: h2 k% {6 \6 ?" F4 H

  • 3 W3 X8 ?: p6 J6 ?2 J, `
  • ( R3 B5 m  e5 Y6 t' E+ s" Z# Z

  • # Y8 Y; d9 I0 f( f$ m
  • & b" a$ Y6 v8 u. w5 K

  • 4 M" G6 g3 k; n& s

  • 5 R; w8 D1 ]) x; A$ Y
  • , ~  ~+ b# y7 ^4 S; G5 K4 [& ?
  • 3 `. {* y6 v+ P9 O3 {8 |/ R
    6 v! C+ j( T' E/ N% |) f

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()
2 o% A7 f! F6 l% z# w& `# j

1da850d5cdd66b7f685d1f819c9f7321.png

, g6 u/ t; H4 D$ O3 I$ L

. Z8 J3 D- _. B
                               
登录/注册后可看大图


9 Z- y5 R( x" q( o% A

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

回复

举报 使用道具

相关帖子

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