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

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

[复制链接]

温馨提示

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

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

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

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

9 K4 j5 F0 a) f  d2 `7 C

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


. \. u4 i7 Z- G, n& E5 w6 {+ J* s" s

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  •   Z; G# o( u% g( D; g5 s; t9 T. ^. D  B
    : x9 E/ y- w& J) o; R) Z

conda install Cartopy
6 _* ^. N, D6 c7 c  R6 w' r8 g, C' D3 _

( B+ f3 b$ H( A: l" r# b9 u

, G" t9 \. {5 q, ]) ]% d+ X
: s. R( _) E6 P# b

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

例1:

  • 8 p& `- w% X9 ~- A

  • * I+ a4 L( L/ {+ ]

  • 8 k2 E, L5 m' @

  •   _+ K' j7 d* T/ i( Q
  • ) Z4 L; k9 Q  l0 Y: @
  • : m9 g# }9 q# L( V
    ( O/ {' d( |  v8 G2 b

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
. X# z' R8 L! r$ k

2856b94b0ff5bf4357137987d7c167b3.png


  • # F: M! s6 w4 P( j: N$ T; g
  • 6 q/ O  Y* n5 c0 C" M

  • + \% A* M; A: q

  • 3 H% M$ C9 u0 V0 r
  • 6 c. c3 Q$ I% i$ U

  • + H& y: q  e4 h
    5 C5 R( B9 B0 h7 x# W

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
+ q" y3 X: G3 e+ `: [9 D

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 5 Y- b& Z0 }) ?* U  H: ?1 O9 F
  • ; y) G* x$ w" |+ G# C6 f- L" k

  • / M4 H/ e  r9 z; j1 x# y) O9 V# ~$ o5 H$ b: G+ q

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
6 h1 Q: ^; _8 \

; K' W3 m/ z) k) J

绘制时间序列图

例:以三角函数为例绘图


  • 0 h4 H2 L6 b5 h# v2 F+ X4 i, Z

  • 0 c' j/ v. g5 o% m1 F/ X1 r6 d
  • 2 K& L; G! i7 q
  • 7 c* u' \& a" [) n

  • $ W0 V6 ]. n8 L& \
  • ! K; q5 I2 F" |8 T8 R

  • ( F% e+ K$ a  [) S0 \7 O! d( ^  h

  • 2 b" E7 l5 L2 V7 h" w
  • % ]# T& I: H1 A* G2 L+ l

  • ! d" o1 q, L7 _6 m; B  f( U" [& N

  • 8 F1 C. I/ [+ v) e( A, r, l  E
  • " G9 [, C# A& _. p

  • 0 o$ k  V3 E' q. A0 g
  • , U1 S7 {/ ~1 ^# i2 c* T& q
  • ' a0 Y' h5 }+ Q& h4 q9 J! V
  • 5 ]8 i( p/ P6 t/ B) g, d

  • 1 f1 _; [- l, }

  • # W6 y' T8 {( ^5 ?. ~! }

  • 4 p: R% C' e" R, x# q/ H& `
  • ! ]3 f* s" s/ Z2 Y9 [6 C4 ^
    8 }- D( N2 `; h4 K2 j5 Q

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()6 n" _3 @2 j7 \& o6 {

7d0cd3e557628cb00d61b8a5a167f62f.png


8 E, P5 A0 z! O7 @: t1 h

+ o: V( q* N) x
                               
登录/注册后可看大图


! }& G7 c8 `5 Y+ {

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • 2 E! ?- o  \6 E2 ~# M* ?' v1 W  w

  • 9 P4 B2 s- m! ?  d6 I8 |6 U3 m
  • 0 {& [; ~. ~8 {$ y8 S
  • * x3 Z( m$ C! K5 {% N% A% {% V2 c6 \1 d+ J

  • ! Z8 ^+ X" Z  g3 _0 V- I. \

  • ' n0 \  N. z& P7 R( c9 \7 f: F

  • - o5 N; z2 B' _+ t7 _

  • 4 t# _& V2 j; y- \

  • 8 K, z: G: S+ C6 E8 l0 |
  • 2 v% W) _& C3 ~4 U6 }! B& x. v6 Y1 d

  •   _& b! x8 i/ O3 b! i+ G

  • 2 q8 u. U' ~6 ?, h; A

  • 5 K, @  @% T$ }3 D3 J8 k5 ^2 i9 S  O3 c
  • 4 X3 m0 t% X5 F0 U/ r
  • " h9 t$ r- `8 _6 z

  • 4 D. k' R' s2 R0 |# f; x1 ?  G

  • 5 I& r- x9 `; b6 y  M+ q* F

  • # \+ i) W, z! ^- w* J! p' _

  • 8 R5 [5 W( }1 R+ u- M- X! G4 A
  • ' u& B; A- e6 ]; k
  • ! P6 z6 V3 x+ x% K* n, J/ Y* i. K

  • 8 l- ~/ _+ F6 C- s9 S& z
  • ' E# P+ M3 z6 x" I. ~

    0 d3 |2 |" V. j- C6 \" W

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()! m- L4 `! O7 T2 ?/ H8 r, q

1da850d5cdd66b7f685d1f819c9f7321.png

# C) _: X! k* t* S- r( I


9 J9 i2 H6 [; I2 ?  s                               
登录/注册后可看大图


# @4 T; `4 B: ?6 B( h8 D2 h+ n4 j

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

回复

举报 使用道具

相关帖子

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