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

[复制链接]

温馨提示

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

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

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

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

. D8 i+ _! T% T

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

# N  ^' y% W( ?; P. x7 J

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 9 M1 a% L2 L- V3 H6 q! b3 n6 f* Z, S! j2 t+ i( ]

conda install Cartopy0 ]: b: D# Q+ o5 w* Q3 f

" F0 X2 ^/ l1 o& G# F

9 |2 H; I, y7 k6 O% _7 x' w$ p# T; f4 Y& B( R8 Z

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

例1:


  • 5 e0 o, F& v$ k6 V! I8 G- Y# V0 F
  • 6 I* v$ w$ K  r, S# v

  • 4 I4 r7 N9 A# h$ l) @
  • 2 Q, v( ]1 I% X6 {! ^2 X

  • # ~/ R/ Q2 ~/ ]0 N8 Z7 j2 g3 e9 p

  • ) a# G: H" \$ H4 v4 _
    1 Y" g; Z  L3 M+ {* S  x# ^

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
7 K/ j$ W( R# ^7 F1 o' ^

2856b94b0ff5bf4357137987d7c167b3.png



  • - a' ^+ D" x- J/ T. T$ y

  • 6 s8 \- e4 D9 U  R- e. B2 E6 o4 j
  • 0 P6 a( M' A7 V% E9 ^3 ?$ U
  • 4 j8 w; G7 c0 W) I7 Y; m3 p
  • 9 }% z  d8 L1 d; B0 o2 R% k" N
  • 5 @; U# K4 d1 B) M/ {; x

    ; O* H0 J, u& ~0 a" R

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()( w' d0 {3 b( a

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • ' b+ f+ ?# \( J5 `+ D
  • ! K' ?% G# ~3 X% t
  • ! [& u1 I( A. d; A( V
    ! X, w: |; P/ x9 ?4 f$ z

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
2 X$ W! C7 v  w2 k


0 `  }- M8 `$ b: S, y

绘制时间序列图

例:以三角函数为例绘图

  • 5 A8 S+ W: \8 e7 V8 P9 E
  • : N0 ?. }) D+ W7 N5 P
  • - M: D/ K. Q+ Z4 `
  • & B& @9 E* w8 U0 f6 n" c. \
  • ; H2 j1 }9 |/ J6 j* {
  • 0 i7 F& b, M& X+ Q( y
  • & b' |& b8 C  Q- y( f4 b' [

  •   F+ ^3 p% J" n  x

  • 9 y4 f: t+ P5 R* G

  • 4 b, U2 v# P: J7 U1 K

  • 4 l7 A; R  h3 @+ \1 l8 s. w  d

  • / a9 Z! }) {" u

  • ! {. h; T* n7 w
  • 4 c  i( E* }: ?8 @0 D( T6 h" |& _

  • " I1 h9 M( Y& ~& @: d! t' L
  • 6 M6 T  E; m4 d0 Q9 [9 \
  • + P0 P! B* r! X  f8 S1 x
  • " Z7 k) }9 F. P$ W% i$ d' U& P/ t
  • ( [1 e( |$ `. Y5 u

  • ' }, M2 @$ Q8 E5 M* p( E3 S  X' j; S; K6 S

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()& Z, z" a3 P4 c

7d0cd3e557628cb00d61b8a5a167f62f.png


6 d- B- M4 h9 t, T  y' g6 Y: `

# Q6 I  [8 a9 b  C' |: P
                               
登录/注册后可看大图

: C* n, P3 B& j- t# }

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • ; x% q! S4 y* `# f
  • ' T4 z+ v6 L9 l6 v! I
  • 8 x0 `4 a( p2 ?& A0 [# [0 ?; d" c
  • / n% Z) z6 m' v# T( x* M8 V
  • 5 R. s0 r' R, V. ~

  • 5 L. M5 Q7 ?" c: J1 y
  • ' k# {/ e& c. K6 }5 I( C

  •   ~' Q  [/ m/ B) O3 Q  F6 F8 |
  • ! h/ b% ^/ E. x7 Q/ U3 I" F2 N" ^

  • 3 C3 A6 {& R- j% h# F

  • " j. P3 v" f" M# B( B# Q
  • % O$ o: G$ {8 k2 G! `# P/ d
  • . `. J& L# ]/ V& u

  • 0 Y8 m5 C% z4 M9 `  i

  • / J! E3 Z( B1 b4 p

  • ) R( p& r% B8 ~* V  Y( U+ e
  • * g' Z9 ]1 N0 e5 |5 G
  • 7 t+ k" H0 f) C# U- I
  • 1 f; P$ ?( c2 ~
  • 5 ^' U1 B7 Y% Y9 h  T4 P: n; N. G
  • 4 e$ a) U- R2 T  f/ |" I1 y  E5 T

  • 7 N7 n7 j- y4 r4 D, T) c( n- o" U( D
  • 0 u$ |- m1 T/ w
    ) W- I0 z% o7 P; P. r, x

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 l/ L. n, ^( l& o

1da850d5cdd66b7f685d1f819c9f7321.png


) C# T+ t3 t4 _0 _) \6 ~


2 z, i0 \) V3 K1 f                               
登录/注册后可看大图

  ]/ V5 N; q- \3 H: L

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

回复

举报 使用道具

相关帖子

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