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

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

[复制链接]

温馨提示

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

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

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

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


( E# U1 q/ h7 E2 W1 N8 S0 ]

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


- T2 N( Y; u+ d" s& g7 [! E0 Q

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • ; X$ ]. Z+ t* X$ f! n! o
    ! e; T0 J, I* h% a* k' @7 s

conda install Cartopy: [- o& I- i, P4 Q3 x, g

5 B  ^/ y- K: s8 h2 ]6 K& H

7 l  M1 Z; ~+ i9 S& m4 y$ I4 M: j: S3 X- y

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

例1:

  • 5 M) ~8 h* ]+ @# Y/ o

  • 2 @. w: J$ M5 W, S, Z* O& K
  • 9 M: h6 W, K) @; @! }

  • 6 o% G6 G. v, L- y9 m- x
  • : i" x3 Q9 y/ D# G- f: W3 }

  • $ w, j3 q$ D% @- n3 L' t: l, U
    3 L& H( k3 i/ Y0 w# s

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()# L1 ~2 j# C; L2 z

2856b94b0ff5bf4357137987d7c167b3.png


  • ; J9 b8 `" N0 c

  • ( s  ]6 [0 I8 Z7 l6 v9 l
  • 4 n' B* b) Y, ~; c2 t) O
  • ! E, u) F/ n3 U2 x( P

  • % M0 i: z4 V* |% C3 r4 x
  • 2 G  h) L( A2 K, ~

    1 t3 M3 P( n+ v, g

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()2 C  x8 h4 l% K

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 4 `: }0 m+ u$ N- c4 \  _* g- w

  • ( J4 R9 ^9 B2 N

  • 1 a5 H+ T7 ?: [7 O
    ( E" i% ]. {  [& |

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片& V0 R& H) z4 ^0 {( S" D+ I8 S

8 g6 Q2 s. M3 w+ Y

绘制时间序列图

例:以三角函数为例绘图

  • 0 H  z$ l5 d! X$ e
  • 8 S' M( W1 S' Y2 P/ P' |$ ^
  •   a3 `. {/ a9 l8 w) J/ F

  • " G+ U) w$ i/ g' s9 L: ]

  • ' c! }" O4 w$ F& a/ N/ o
  • 7 @3 I; o3 w. V' x

  •   s( L0 ~6 v1 O7 F% Z& r
  • 5 D' z% Z, S* X# s9 Q1 I1 j
  • $ f7 t7 f# e+ ~- y/ O! d" d* r/ z

  • 8 i# [& H6 C( ~% M; `
  •   z3 x- W8 o! y

  • 0 N8 u, Q% I8 a% d$ v, k' p8 l- Z

  • & b, n& ]8 F; W3 e

  • $ j+ o: F1 U0 [

  • 7 b/ C# _8 p* ^1 `! K! f' v

  • ' P5 A" M7 K# J, c$ A- i0 ~
  •   s% {# K& i1 K% N

  • + m( x; m% B1 f5 X' a( k0 s
  • : A! g& m' J0 F2 i
  • ; U: C. k* H* `5 E2 ^' E' f, O% f

    ) _7 Q' o* X% r4 T; P/ m$ T

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()9 s# C" Y! A6 l& V, B- d

7d0cd3e557628cb00d61b8a5a167f62f.png


7 N/ s& V  `/ z+ Q


& H+ {, Q  L4 U) E! s/ x                               
登录/注册后可看大图


% i) _6 c2 s1 ?  V

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • ; c0 {1 h( C3 n) e: ?

  • % g! I1 z; h8 c8 v2 Z7 t# o- E, d

  • 1 b9 t, q4 J/ P+ W1 ~/ i/ y& X, Z5 K
  • & q  ~' d( D/ E2 W) b6 P3 q
  • , ^  _( L; }6 d) I* W" P1 c, a

  • ' A/ A$ b9 A" I( k: s

  • ( x" i7 t- d7 a. E! u( W& f

  • 5 {- U" y5 Y6 W9 Z% h

  • * b  t/ b3 Z" e

  • ' R0 O& G9 O2 ]% q( ?9 w$ N
  • $ J( F$ G/ v4 x; G# u1 }7 r4 c

  • + e2 S2 r8 g& B
  • , @7 O5 \0 q0 _' _' @* n0 ~3 T: j
  • ( R+ d. `0 Q6 Q6 x+ \) J+ b+ U
  • ! ~, v# U" j7 {$ v& j
  • % N: l$ A4 ]3 A- V0 B

  • & K8 K" ]' K9 i

  • + w* o$ S( b! [
  • ) ^+ p1 A% j0 z+ w1 N- s
  • 2 G8 N& G1 L  @

  • " b7 p9 T& t' l
  • & ?! l& a- L9 W- u# `1 P
  • 7 j( K. G& C$ Y: l+ y2 z8 y
    1 L# n& S: y) f/ @5 v) S

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()
9 \6 o& g& F1 X1 k+ x

1da850d5cdd66b7f685d1f819c9f7321.png

3 Y$ f+ S) Q4 D+ d+ k

/ i; \1 o9 K1 j8 P! X! L
                               
登录/注册后可看大图


, b* v7 X8 [, _1 r

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

回复

举报 使用道具

相关帖子

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