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

[复制链接]

温馨提示

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

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

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

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


' Z$ N* W% O% B+ `; Q

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


, H/ P+ O! T; K

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 5 M1 |6 S' ?5 f1 V: }& Q- @
    ; K' o$ g+ s" K

conda install Cartopy
+ \2 u/ l$ [, q% @0 v) h- _


+ n, O9 D0 `6 c4 K# I: g) O5 D2 A3 J: s3 `8 ~5 L1 a# x0 `

& |, ~" i, R2 K' t7 G' b

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

例1:


  • $ F3 t' u4 n* Z$ Z) H; m2 m
  • 5 B) f4 J3 O" {7 L8 W, y, a; `  _' D
  • 2 f0 h& A6 @5 \4 S+ y( f" I

  • % F6 W; D8 y' t) \5 Z
  • 4 D9 p- t, d8 g& {  b
  • & @0 L7 X, N$ o, Q4 D

    * }7 w+ k1 g1 [4 \: F

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()" ~, Y" }9 n' u$ a- q) M* O

2856b94b0ff5bf4357137987d7c167b3.png



  • 2 A8 G6 b( u% J, I
  • 9 E. W2 {7 c9 S
  • 8 C6 a0 _' z2 r2 D2 ?& P; ~

  • * I7 g6 k4 l- a4 |* {) Q$ D

  • - C0 Q0 I" E& p/ {! B

  • 8 [$ ~) I) f4 O2 m! |; M% g1 i3 p2 |8 T9 \9 [( q- @4 D: e! s

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
2 w. ^! i2 M' q

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 1 ?/ H' f' ]' q2 G+ `' U9 `6 T
  • 8 F9 {5 u! G& Z2 x: L

  • ) u. h8 e1 ]0 \3 c) r; `/ o
    + v3 l3 r; x3 _: Z

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
- p; T+ U& k! [% F7 e6 \- L. r* r


. @2 g/ u# h2 d1 A: i( i4 y& e

绘制时间序列图

例:以三角函数为例绘图

  • ; q* _7 U9 E8 X' r8 p
  •   J( I4 W! w% c+ U& ~/ i1 D% J; Y1 e
  • / C- z  y( y: p; @% |% c0 ?. N

  • 3 @% P9 _+ S3 |: c- S9 E
  • 5 N$ b7 l. h6 d' t, E

  •   j8 n) t8 g' J4 c  J$ n
  • ' O* k9 N5 S& ?0 @

  • : Q4 N- K# ~* }3 e0 @% o7 T1 r" G

  • : n* E5 ~# C  F2 `  A; J

  • & d% h' m  i* D' J8 u

  • ' N( g- e4 ^& O  H; [
  • ; t; K. J8 F% Q4 h2 s3 w6 Y

  • ; r. S8 L, {7 M3 B; s

  • 3 Q  M) A8 u' _8 _' B+ k

  • ; k0 g0 ]  c* k9 R& J" |2 j( n. l
  • - R8 i9 }) B2 b. U8 T

  • # P* |5 U5 e' r' ^. Q3 D
  • 4 G) W/ v% y# F( A8 t2 u& l" ]. [1 l
  • 2 M& P; |! W$ G% W* K) Z! N
  • 2 ~  q7 O  V" b: b
    # _: g" x# O4 T: T, @! K

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()' x, ?2 v# |; {" }, H

7d0cd3e557628cb00d61b8a5a167f62f.png


; M: F; j, v, c


5 G" Q# M  o# R7 u9 C0 i                               
登录/注册后可看大图

1 T( O0 m' L8 ^  y

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • $ B. J& d- \3 v0 I/ [% ]* e

  • % r! K$ e; z6 k. {: |1 _' `

  • 0 W. K" R% `# a3 V& L6 w

  • 1 c* F  F. n5 |' u, |, v$ k* }

  •   x/ _+ M2 T& b

  • 5 L; e' R4 O3 q& k1 C0 ^/ E

  • $ @6 J9 h* r; t' U0 K3 a% \

  • 0 W* h" l4 n1 }9 Q0 l

  •   O- M$ h: v* H. F
  • 8 g$ \: n8 w4 {6 x- K% t
  • % B/ e) e) d4 h% g, }! B
  • 2 `' D5 V* H1 l) d% \9 F4 S9 R! g8 V
  • % V4 S0 k; Z' _& W2 y2 f* {

  • - e9 r; H* L& V: t$ T

  • 2 T; n1 c9 r8 ~

  • * ~, l! m- r) F; j) R. c5 S/ b* e

  • 6 H3 A7 q% x6 }0 I) u

  • + X) d: i/ M2 I. w+ |" O* A) h

  • % n. s1 ]6 c" I: S
  • ( d( a4 q. b' A. K% \. C5 ]" E

  • " V$ k, Z) Z" q7 b/ L3 C
  • 0 u( ?5 M$ H; Y2 D& o
  • , ?2 e3 \9 E% i( |$ s5 k
    , i% g. A# L; H  u" D) j

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()
( z9 I7 Q9 }" u5 n: a5 C

1da850d5cdd66b7f685d1f819c9f7321.png


& h0 t2 e2 R% b# M3 I' m

, p- W$ E+ K. a7 q6 d2 Q0 `
                               
登录/注册后可看大图


; ~! z; V& A$ O& m! w' b$ y

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

相关帖子

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