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

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

[复制链接]

温馨提示

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

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

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

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

# t1 D& s& Z6 s9 F

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

6 f' i9 U# o' z. e! T1 U0 [

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • ) p( t# }8 m, |6 w& \" K6 P4 k- q

    8 K: J4 K! O# K3 N8 u

conda install Cartopy; m, T, E1 M6 d7 M+ w


, \  u0 Q& ^. b2 g0 O0 H2 g1 {* n" L, t4 v2 O: L1 z

% P5 J! n. e6 H+ U( I3 t# l5 U& ]

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

例1:

  • : `2 B, z" d. n* R/ r' d

  • $ `; E# {  }% F+ o5 m

  • % Z4 I$ C7 o( Y6 q& M( B1 c  ~, V) [1 b

  •   ~9 G# T, R. t5 r! V1 Z7 O( F

  • 0 f  `0 s6 z  y5 m4 [
  • 6 e9 O* X8 u0 e2 d1 F

    / G  a: a. F: ^" H4 N( D, W

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
  @* g# f1 f# z. b% [# T& @

2856b94b0ff5bf4357137987d7c167b3.png



  • 1 C/ b2 w3 H+ m' N* o2 ?6 f) u+ E
  • ; p7 @6 r+ \! P; d+ G

  • * V2 b: B( l7 p; I# r, p

  • ! m$ x) W% {6 ?

  • . i$ K$ M- i4 q% {

  • 5 ^, E, I$ {% \; ~0 I/ Q/ K7 o* w3 O! K7 X2 D/ w

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
: X& V  i' V# w% R, G- f" M

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  •   D$ r7 x3 I, N4 N9 ~
  • 0 P. M8 H6 [$ B2 m: Q) L( ?% l
  •   S7 G2 m/ Q* G3 a/ \
    " Y2 Q6 o# J$ T8 Y1 m2 ~* I0 F

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片/ K# f: x( x2 }( g; n1 f4 |( j

$ ]4 d' }  t2 X/ c4 K

绘制时间序列图

例:以三角函数为例绘图

  • 2 ~' G' _1 E  R
  • & H* H. ]( y* p4 a6 W
  • 7 q2 {- P( w6 z* v1 l3 H
  • 1 R: R  F+ B' k

  • # P! T3 R* Q: k5 S: v  G

  • 7 |. O! C9 O5 p. Y4 ]1 t1 q' ]

  • ! c9 c4 ]) d$ W2 \$ n5 H( p( j

  • + I, Q- m6 F( I) Y
  • " e4 Z" @/ j- o1 q" T  u4 ~" `
  • ' K5 t/ l, J2 }* y/ g1 q
  • 4 ^8 t3 Z" i! L7 v. w8 t4 H

  • 2 a1 P  \6 ~/ x% I, c
  • . T0 I- e8 x! A, p. x

  • . M: H0 ]7 p5 d4 P* Z
  • 1 X- x( x, c8 \3 P; \
  •   K$ }9 w6 u) G0 a. w
  • 4 Z5 T4 D7 l# Z: ^4 ^

  • " p, x4 W0 k8 {1 Z( Z- S

  • % H+ p6 r. D6 N+ v
  • 9 T2 c$ @9 l5 j# p: l
    * a7 ~' f3 {2 J/ x% M1 m" z

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()& @) h4 d- ?7 M8 X; q1 k

7d0cd3e557628cb00d61b8a5a167f62f.png

7 H, H; K2 p$ c# H: \! ^

5 g* X; K3 D. m  v; _- n5 ^+ B) y
                               
登录/注册后可看大图


% C* H. p& w6 K: D! z% W4 ]  q8 P

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  •   O; F! W9 L8 w7 c
  • ) H: A2 }/ Q3 y
  • " r2 |% s& ?% ^% q3 B8 F( _
  • 9 z* h% k9 s. n/ C+ k& `5 L4 L
  • " ^, p+ F' i; O1 N9 u) o9 ~+ F

  • " X9 @- x4 t. S% I

  • 1 q  `9 I$ Y% O# r, P
  • # z5 U6 f* [3 {: y' w# |) a
  • 5 ~( o% ^) e$ C/ F/ d9 P6 E" c5 |+ F

  • 7 Q0 z$ ]# j0 b& v0 H
  • & j( A* W: W2 j

  • 6 B6 e, f: z8 U; s; x; ?

  • 0 S# _4 B, i4 ^9 D4 z
  • / Y1 J! a  W& l: S

  • - a, V+ m7 l/ P' v$ }0 D# B
  •   R1 N5 `: N0 B4 A

  • - Z+ C2 W" ]+ T5 o' }: q8 r

  • + N0 i, G4 p" [; l6 c& o5 C+ d3 X
  • 6 G3 Z5 g5 b  x+ O2 B. ]- w
  • ( K' i7 }" Y8 p( N1 v) R3 \

  •   \7 s, C" ]" L& S/ V
  • ' O' {9 g" i2 X6 x: d* _( Z

  • / o7 X) ~3 W! A# r) F4 g/ p& G5 ~# b8 c3 B8 q: q* N' M

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()0 ]) o; y7 e2 B0 K# @  ^

1da850d5cdd66b7f685d1f819c9f7321.png


0 L! @! \' F4 J+ d% F

; r& L. R3 A( E' m8 z
                               
登录/注册后可看大图


: o" d: s+ _" ^& Z- _. T& f' C: J

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

回复

举报 使用道具

相关帖子

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