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

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

[复制链接]

温馨提示

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

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

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

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

; y0 u4 g) i6 x" ?$ b1 |

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


) l3 h& K% V6 C7 ^% k& A3 X) o& b4 W- k

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • % N/ j0 ~% T0 _1 F- _  z+ g8 p8 ]6 P

    * M' A4 }, e: w/ F$ Y

conda install Cartopy
9 \' R( `( g7 t& ~% N6 l

' V  x: T# Q: b  g; m, H
: S/ t1 \/ `, b) j
# F/ f/ o7 o1 Z1 I7 y6 v: v! w

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

例1:

  • : A' R7 R, v6 }2 ?/ d5 W
  • ' Y+ j' x* w2 m
  • 8 t* S  m3 F* e0 P* y/ @
  • . E- @: i( k" x) o/ s% l/ R
  • . m) Z2 Y0 r. I& g( R
  • 6 T5 A+ R+ _( Q& A) [. ?5 n/ q% P8 `
    7 R! `' I; {6 e2 I0 N0 y

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()$ ]& a' C/ n, s6 e

2856b94b0ff5bf4357137987d7c167b3.png


  • 5 J3 c" U7 z; S; M7 M$ r* i
  • % W$ s3 G9 e1 a1 Z4 f6 [. _% B

  • + w0 Y& c& j) X) V+ R& l. d; K& D; Y
  • & q1 Z0 r( X  n5 v5 v

  • # |9 E- A+ c+ @9 X0 j

  • ; _7 v! R# ?+ [. [3 M% L  e1 b5 |) b+ j7 J7 q2 Z

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
1 ^. f. {6 i$ Z% f4 M# M3 u% O

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • . B* A0 g6 c- i% N
  • 5 |9 D% O/ q( y% _

  • $ T, h, z1 z* V3 O% H+ B$ r: }' G- i0 n7 P; |

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片6 K9 M. Q4 V/ M4 F5 \7 b* J# U

+ O- h. p/ X7 Y( y5 D  ]3 L

绘制时间序列图

例:以三角函数为例绘图


  • 0 O/ l3 o2 N& o
  •   `* {. ?- |+ ^
  • $ K7 g: p4 p) C6 w, D* z7 R

  • / f' \( J5 I, _) z' O( y+ M
  • 2 _6 w& q2 k5 a) ^  G( ~

  • 2 r& L/ G1 ~% d' Q" s. ~
  • 1 T6 h' ^, O& u. B8 e# _
  • 3 ~$ }- c3 v6 X  f0 r
  • ) [/ z- L! K% S8 q% \% d1 g
  • , ^& n0 i. A, z1 O: U. R: n1 t4 t

  • : C0 |; A, Z# R  }: Q9 Z

  • % e6 y, Q4 z! k+ I6 P2 d5 q# a

  • ( r- @  p+ w# f" V" c
  • ' `7 c, @3 v2 ^9 O

  • 1 F- K2 R( z# e/ P! g8 V
  • % S* `, A. s7 e, B, L, s

  • ) T) P: W5 F0 z# M3 B
  • ! ~- D- H2 H: f6 r6 ?+ L( v
  • 0 x1 ?. b4 p  I" h8 _+ |

  • / Q9 G) s: z, l& r$ `) V2 s1 M, P4 e% a) X; L8 p, L

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()
& ^# q# x( e& r( @& ^0 Y

7d0cd3e557628cb00d61b8a5a167f62f.png

% P3 e. g# t% w7 Z* y: k/ B" |

. B/ N; _; V/ f* |
                               
登录/注册后可看大图


9 {/ U0 s3 _7 F, B) f

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • / C" ]. ], H+ R9 B# G6 c
  • - J0 x, ~1 p2 W! B4 |% ~
  • + S- @. x3 L& ~2 m" i* C+ p
  • 6 e$ T" i& ]  _1 u$ K

  • % q2 u8 ~" |& @: @3 f
  • 6 J3 f+ Q# y8 ]7 |

  • . R( \# P6 [& L7 i5 L

  • & Z1 E  A# n$ X& N2 M' ^. j  P' _
  • 5 J; I2 d4 Z  j4 P

  • ) N$ u- v# J" i8 n( M
  • ; `" C' T! y6 O. H: J( y0 ?# y, S9 H
  • 6 u, G) ]5 K+ p0 ]6 u' M0 z

  •   g' J! T+ [9 Z  s

  • 4 d7 {4 A  M" y  d$ h8 }( x
  • ; Z" ]8 D; o- n8 ~$ e

  • ' l) l, x# a. t/ D; J6 ]% J
  • 6 C; z+ s; |: Y+ v7 X8 r

  • # {8 C3 i! [- K* x! b
  • 0 t$ A5 k+ \* u3 Q4 Q4 I6 \$ l3 ]

  • . w9 ^! i2 \% V( u5 ]6 B

  • 5 c0 e3 b2 a7 F, P! Q" u- H
  • 4 {- P# _7 i* Y  Y% f

  • + F% ^+ `6 ?9 U+ `
      [$ ~0 n) ~; }. N/ w( }4 a9 L

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()
! v$ F3 G+ N: ?& ^# g+ x: _

1da850d5cdd66b7f685d1f819c9f7321.png

' w6 i( F- c0 U! T+ h


) b: G3 g/ {# b5 k+ ]0 F1 q: g                               
登录/注册后可看大图

9 Q0 L$ V, r1 ^7 c/ c+ z$ |+ \

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

回复

举报 使用道具

相关帖子

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