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

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

[复制链接]

温馨提示

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

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

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

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


8 f0 g4 T  e: s$ I, \' q5 t2 z

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

) ]" H3 `: ~/ C5 Y- T4 n# ]

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 7 s- A5 L. l# `* i' d8 w% z5 y- j6 S3 J; ^+ g/ Q. ]) f; h

conda install Cartopy
) N6 q* |' v! r" t& W


( n* }7 a, t1 W' `
8 ^8 c( F5 j" D
3 I4 D$ m" K& q, K% Z: {0 k" D

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

例1:

  • ; V0 }4 ?. q1 _$ x& d8 p

  • 2 Z$ v2 M2 c% X+ t
  • . F# ~7 }( X( ^/ x
  • 2 _' B; F9 U& T6 e7 {* j# e

  • 9 L- G+ c/ z& s+ }1 J
  • 6 L* D, Q' F* q: @. f  P

    6 ?2 X' V, d0 I

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()9 J- h% H! i: _0 `' m, Q* P

2856b94b0ff5bf4357137987d7c167b3.png



  • ; z1 y- }, S* D- p1 e. X& z" g

  • 6 W7 E! o1 b- y2 ~& K) z2 k3 G

  • 9 X- E: S- S( L3 D3 k" _( M+ q7 P

  • 7 p  r5 |& `. @/ [% s. Z
  • 1 [. p" ^' k0 c7 @0 U# j
  • 6 C) f. B$ q/ S, Z7 k2 I+ \9 f
    1 n. [8 z  f% g5 E! W

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
5 _& D$ \9 y' u  E6 k

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 1 A5 d( @- g0 l0 r2 r

  • " z. R7 M" a# `
  • & B3 i* n6 K9 z, x
    * V" V. `2 |1 }4 G& r& p) I

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
4 Y% Y2 @0 }4 E3 M# j# n& |; [* y$ Y


1 L( c4 q0 x" Q' E

绘制时间序列图

例:以三角函数为例绘图

  • 8 |# r: D  O3 S" I# K+ n1 h
  • ) W" O' y3 R: U) \) _) H8 r

  • 7 \2 l2 l2 W% ?
  • / e2 G, j/ I1 o( E5 h# j

  • 4 ?" A: E, ^5 S% Z( e' H; Q
  • * |+ D* I- a5 O6 u" }& u
  • 3 J" C  p4 O1 y) ]8 N: E

  • $ s/ j. A7 W: _5 v
  • ! @3 d5 z  k3 D$ I% r

  • / M8 c7 ~* z$ e" ^3 j

  • 3 A( V4 D3 o" e

  • 2 N- ~" J) c$ b7 p' O: ~

  • 4 D! x7 B  _1 o

  • ( P3 V2 y. n; Z$ q! X) `; t! {

  • 5 [7 v5 v6 R+ g' h# L' i
  • # X5 `( H& D) R$ H! X( s5 k

  • ) X6 U  H  _! P# S! I5 z3 f, }, t  W+ ^
  • * N: U1 a6 C2 W" N2 ^# D9 Q9 D
  • * y/ o3 Y. S6 b+ M
  • & p7 H" n  |9 N, W: _

    2 y, _2 E4 d5 D7 l+ o; M8 D

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()
, t7 U+ ~; W$ r; r/ U1 V

7d0cd3e557628cb00d61b8a5a167f62f.png


- }: J( `1 `5 L9 g+ ^" s* F

9 x4 p: i; d( P5 ]: `) y; S
                               
登录/注册后可看大图

" _' O7 ~1 S8 ?, y4 G+ a0 a2 W

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • 5 D; h: P6 @/ l, D, X) s
  • 0 y0 ^* `! `8 w/ K# i2 ~
  • + s- h1 P" O/ s: ^
  • & F7 t- {' O$ b

  • ( |# V+ E3 G4 s& F, ^

  • - a0 r( m; J3 q4 U

  • " c: x4 B3 h1 A1 w3 Y/ j; v
  • % t- l  d% I; J

  • # T+ T: w2 }0 P, s+ t( x( }
  • 7 M  G7 P: V$ [
  • 1 J' O; k' b$ t4 }  ~8 E

  • : g' Q. B/ T* y! p% W# g* a9 ]

  • 4 ~$ _9 k- [" t9 l1 A1 f/ ^
  • 3 F# e/ X4 K( [3 P9 N
  • $ ?5 p* y* H& i. O# |

  • , m! }! _1 H6 X$ e: v+ G4 x
  • 7 X9 b& I  X' V$ {
  • + h1 q7 W2 {+ z. w" V& G9 j

  • / W+ |/ E! c" g. L: u0 T: \; c

  • / l" D7 z+ C$ s' F( J% G

  • ! n& x, O# T+ z8 j  _

  • " m$ q, W  B& _9 H

  • * d) n9 K& i" _0 {( f7 L4 Z
    ( b, e9 s/ u4 h- N, u6 \0 l2 ^

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()" z2 _) Z9 c! Z  `. d

1da850d5cdd66b7f685d1f819c9f7321.png


" _& ~  v9 E+ L! Q7 R3 j

/ T# J% s4 c/ q+ B
                               
登录/注册后可看大图

7 s+ [% C- e" Q3 k* a5 P, x0 F2 P* I

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

回复

举报 使用道具

相关帖子

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