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

[复制链接]

温馨提示

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

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

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

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


, n' r: F" Z0 x

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

/ F" T- A$ t: b! ^1 o

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 5 W+ z. O. |9 N( j) t1 F& n$ l* R3 X! N: f2 T5 g3 k

conda install Cartopy$ U3 m1 Q. @5 a2 x

% i1 Q% O0 V/ H0 l8 I# c2 Q3 y# ]% a

; w- U6 j2 ]. b9 `4 ]
, K( @+ s/ ]: v6 N

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

例1:

  • ( w/ o& j. ?. z5 U1 O! ]2 d

  • 8 o8 o  T* p' s. j3 z+ ]) L# u( x. j) a
  • * P  E6 T' \% e' u: C  G8 Z
  • ! V6 }  O* }$ y& O: F

  • . x9 Y; t8 M5 y7 S. I

  • ( ]1 c8 t- |, e6 W0 v  W" W  T0 ?! @. @: h

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
( B& f+ K7 v) S) y( F5 ?9 Q

2856b94b0ff5bf4357137987d7c167b3.png



  • ' v( ~: D0 O4 l

  • ' ?6 F3 B( B  K; u2 Y7 c2 j( ]

  • 1 o3 i: X, f% u- x5 }  W( a. Z  x& l+ K

  • 8 Y+ f7 P3 a: t# X! X/ U6 f! a5 Z

  •   k  w* C, P$ k4 k* d# K. d

  • * M6 J. E& G) m0 u5 K* g
    ( X% S2 c$ X3 M3 }  S2 Q) z

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()  u6 j& s! {  n& n0 L

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 0 [" t& `( Q) t  G

  • 8 m1 ~  X, X$ ?
  • + Z/ U: ?% X5 I( U
    7 f2 O( @7 k6 T8 @( ?0 T+ h

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
  D! H# v1 P: h


/ v# l+ b/ W  B: j) |! |5 A

绘制时间序列图

例:以三角函数为例绘图


  • ! F+ V4 p' c1 q& t) T0 H

  • ( u0 [5 N, \& ?: q9 M

  • + T+ ~8 m8 Y( _- d1 v
  • 3 D  u, o! b8 m) t0 T8 j2 K
  • 6 h7 z  B# X- F+ _

  • * w0 m; R. t+ l$ I" S0 k% x

  • & K6 w3 M1 F1 h" R  x
  • 3 T! g9 F7 n1 N: j- E: J8 u0 O5 u  f  L

  • 1 {) p' S$ p0 C+ p& Z5 w$ S) K( Z) r  f
  • 3 D" Q9 Q  m$ |, h: F

  • " c0 H& Q9 _& Q! |/ C* l

  • 9 m6 p" k- @9 G  R

  • : T- D! K6 s8 m/ X5 c) I3 f+ u8 @
  • ! L9 V, m  J0 l- u$ l

  • $ ?) Z, ~" H' l% R* W% v* C0 b

  • 8 a( H$ U2 {; t$ t* ~& v* V

  • 9 D$ T- e5 j) ]2 n+ e

  • 4 k2 p6 e/ }, Y. ]# r8 I: j0 Q4 _

  • 2 \- U( x# B3 Q  R. f9 A, O
  • ' M# H+ E- f! E* E1 R- p. f- n
    " q) J0 D; T' l/ y! X

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()% W( H/ R( |+ j; c

7d0cd3e557628cb00d61b8a5a167f62f.png

9 T: ^7 [) n* X9 Q& u& G

! q* X- d) Y7 H" r+ b0 l
                               
登录/注册后可看大图

8 Z8 s# t* |, `

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • ! t' y* d4 E/ y$ u) i! B7 r; a

  • 3 e( k' _" ?4 F  l
  • - c+ Y) u: ?7 Y& _

  • / U5 `4 I( H5 I
  • , N. c  p3 N9 X% y2 m, i
  • - O! A; s! R: f" Q
  • ' y5 i* V* j( `! _! d4 [9 b( e: J
  • 2 a- I( F' a, H4 W- n. P5 Y' T5 ?
  • # h, M* Q0 Z1 r; n, N  c9 K

  • ; N" B" o. a, v2 Z$ R7 t' v$ [" f

  • 9 \0 E; B& n; ~: ~9 b& E: Z0 f
  • 0 H2 V( t# @0 L2 z. \+ D
  • ) x! x9 C% v* c9 p: t# @

  • 3 }- \8 t3 S' L6 ^

  • + U- Q7 B- T* Q3 V! A0 p# V6 Y

  • & r& q. a; C+ ]: G: J
  • + N( d% e! F+ U/ Z" M- ^
  • : c" Y- j+ i& b) k1 u4 Y1 B
  • , Q% ?8 ^5 |9 h( T: F- c  P2 B- o
  • ( }) K+ D$ D5 n  V) r

  • ' G% j( M9 ~! O- U, n: ^0 A% X- D

  • ! Z7 k* H& c' A0 B
  • 8 K# p( o/ J. t6 V5 [; w7 K! E

    - L2 v% _" n/ U& a. 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(); ]8 I+ M" ^- Q. p! `5 Q

1da850d5cdd66b7f685d1f819c9f7321.png

7 |. m  X3 B* V# ]) p

0 D& o4 I* y9 p
                               
登录/注册后可看大图

# L. @! O. h- C5 A- d* y# a9 r

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

回复

举报 使用道具

相关帖子

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