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

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

[复制链接]

温馨提示

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

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

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

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

( |* h+ a% h& g' ?

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


  a) s- Z) `( ]

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • 6 B0 [; c+ q6 u( [: k
    ( z: ?) N- c3 D/ D- G1 Q

conda install Cartopy
& [! \; k$ A9 P


7 o) S! l) |1 G1 u# z6 |1 A+ `1 W6 e3 a9 I! p  d4 `" T9 N

  `. @4 {6 x8 j  m: K* F, e

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

例1:

  • - t4 v1 S( W) w% Y
  • ( _( y/ E+ B+ I6 y1 T! E
  • - c7 U2 }6 Y0 _4 p# ?$ o

  • $ O7 n) q. s" D, W8 L7 c
  • & T" X5 v' T! L- {
  • : z9 {; j) m5 L) Q* C4 E
    0 i4 ^- N+ K) w7 l1 d& d% _& O

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show(). y8 i  \/ D& m! p6 E

2856b94b0ff5bf4357137987d7c167b3.png


  • % [4 Y2 a1 H0 y+ p4 k3 v$ V9 W

  • $ j& B9 q: \4 u. n+ I
  • 8 W; c( m8 A8 q% D# f/ p

  • , [9 h1 k+ |6 A5 H6 V8 H( N
  • # S+ ]0 f7 ~( _, b& v( N1 P
  • $ c, _& Z8 Y) {$ z5 ~1 r

    & l# S9 F/ E1 J2 V( D; X9 L

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
7 M% j9 ~6 N0 K, \# y$ Z  w1 f& d

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • & T# P2 U* [, K3 W

  • 3 U1 X7 V* {$ g  b' x
  • & v5 t# z: ]% G% B9 i
    8 I* u- T" ?, ]; t7 L. z9 h

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
2 Q9 @! v1 _  A0 k) B# J


# v$ p- P) x8 t

绘制时间序列图

例:以三角函数为例绘图


  • ) w+ n+ l' Y7 X% y# w

  • . h) X& a! \3 d3 k

  • 9 j. K; y8 T% I; T3 |
  • 8 n( d0 ?7 l( |1 H; \. d

  • 7 Q% ~4 z& U5 t$ _: l
  • " B! o8 W% o" K' b9 R

  • ! _% h2 ~+ ~4 _" d6 b" c# h: k

  • 5 x0 }5 x  V. V, u! E" w

  • - N! A8 _7 T2 S$ Y  {2 N) C

  • 9 ^" O: B/ x, N& w# C; e# r
  • $ J3 M; |3 s5 t
  • * M+ m. S9 f( l! Q- N7 M

  • " w  r; a- Z6 D& |- Y
  • 0 X3 @0 W# B  O  r

  • ! g- w3 l3 b4 {( L( g% b$ V

  • 7 N; D3 @3 m: N$ c" {
  • 3 z/ b  C9 o. M! u! o3 ?! b9 D

  • 8 z( e7 S$ ^& q' O# `

  • ) T1 {7 ]1 U% Z- ]7 _

  • - J  d6 F: Y1 I1 B  f, R: r) `1 ]9 V6 k

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()
) f' `5 H: p: }+ ]# B; p. I2 h

7d0cd3e557628cb00d61b8a5a167f62f.png

* p8 z, V+ {) L; g2 z


; `6 N( h7 n2 [& G5 P                               
登录/注册后可看大图


$ w& M7 ]: `1 ]" l+ m

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • : Q8 y0 C0 N8 r+ {* n) x
  • , i- d7 B4 |, }  U  c- d

  • ) O$ W" g3 ~) J  k

  • 7 n) J- T% E1 P5 x

  • 1 k, X9 Q8 K' l4 }
  • 8 s5 I7 x& G' E6 r9 Q
  • ) A# j% x% y8 u4 }; s7 z( c' z
  • ( N' J7 Y% z# J; B& Y; B2 z& K

  • ( H7 z% |/ o, Y7 M" B5 x

  • ) H$ ]/ F5 I, B4 m% J% D

  • / t7 t! k1 }; T& w" g
  • & @: Y1 r6 o) z

  • , u# d. i. {3 \8 R2 m: s$ w

  • . g6 A4 ]$ h7 i$ |- ?6 B) a
  • & {" y( i7 E' }- T1 j9 z3 a1 l
  • . X; W9 p# f. x

  •   N) v/ k0 ~( B# g" K: f( C

  •   [& _! C. B" s# R7 F
  • 6 H3 a8 m# ^# b% r$ _, ^
  • , |* q. w  C8 K2 l

  • " M1 ?4 U3 d: e

  • - w. B" X/ A7 N: o( L* f
  • " H' L/ D1 L) ]; U9 A; W

    : A. m% o' Q' h; E3 G8 C$ a

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()
/ S+ S$ X! b/ e8 f# T8 s

1da850d5cdd66b7f685d1f819c9f7321.png

" e! ~2 E* R! \( `

! D9 O4 S- U7 ^; r) x5 R" d
                               
登录/注册后可看大图

' I+ m. [8 k: k: ?0 G+ M4 X- T

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

回复

举报 使用道具

相关帖子

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