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

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

[复制链接]

温馨提示

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

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

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

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

; `' z4 r8 N; \6 z5 V

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


" v. U: u" S7 I! E, `: J

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 4 V4 Z+ |; S1 s; P1 I4 V' [- p; b) d+ c1 t. w, z; v

conda install Cartopy
* Y5 d! R& d  s5 j


$ Z1 h0 Y9 l( R  j" }( {" W9 J; x5 n+ f5 \" G: x. `6 F3 \
( ~6 w: U& q0 ]1 Q" o  P  T; P6 B0 K

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

例1:

  • & f+ i' `% Q5 M7 {. i+ I& ^- v) S

  • 7 q' w' C$ j' s3 m- s  X
  • 4 j+ T6 }3 j$ u0 h  X3 O% u
  • ' N2 n. x( M) l2 \$ |. [9 I
  • + t0 L- a  \& `. }2 t$ ^

  • 3 }6 g& q3 R& ~1 \% L% x, H/ R9 [2 @5 G+ N* B" Q

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
9 v' G! E, ?, m# {

2856b94b0ff5bf4357137987d7c167b3.png


  • : H. O' q% [( Z
  • 8 F. v5 i1 v3 M4 H6 L9 }

  • / {5 y" v9 W- w$ U4 _. t' c! M
  • ; R8 ~# @) r  O4 b. W
  • 1 q  [& ^& r5 |0 o! Q2 m! c' E) h7 ]
  • 4 S: C! Y" N& S- f' S  i

    ; b# L/ ?3 E! C) `

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
; g* P; ]2 d1 p" A  L

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • 4 B6 P' v- g. R: C/ Z
  • 1 L, X4 m+ g3 L) x  e

  • ) y# m& D8 n4 I" T
    ! E4 H1 o2 z3 C/ a$ I

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片0 t' I* S0 q; O& X% h/ q1 J7 Y


2 t2 {/ P; R* `& K& ~, x2 I

绘制时间序列图

例:以三角函数为例绘图


  • 3 d! p' Q; z" c* y+ @4 p( m3 [' P

  • - u7 c$ N+ t' b; C" @( C. k
  • 1 [, T. c* b" E4 V
  • # f6 r( ^" P2 v% I

  • 4 W! |" C) u0 ?& t
  • ( z( h' {" N7 b3 v

  • 1 J+ J* d, Q9 T) g& r! E" [  v$ o

  •   z. w* x' }1 b/ H$ X

  • 7 H2 ^4 i/ Y2 S: N7 ?
  • $ }0 x# r3 l/ x- u# a

  • + [8 O- ?% R3 J4 ^6 j4 }* ~6 X5 j. A
  • ( g% l: K: H4 p* z$ Q. M' H( i

  • 5 y! m. H* t; `) K/ C
  • 9 o2 A9 r9 A# M
  •   n) M1 A2 x) D, `1 ]2 U, k

  • . A' v' i% j! Z( H  w* g

  • # s: }1 x/ Y" N( b# {$ ?
  • * j( I& a+ {: C& J

  • 9 J$ H' r1 r! ]& I

  • & j1 @+ H9 ]$ Y/ F9 }* Y, N/ [- u
    0 }& i# W. a9 R/ i0 p  g8 ~4 y

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()* v/ f5 @! D% E5 u

7d0cd3e557628cb00d61b8a5a167f62f.png


& v' `% o0 R+ I) I9 Y: Y1 B2 R


$ ~5 `" T; n6 R( g0 R6 u# G                               
登录/注册后可看大图


7 p4 ^2 L3 {2 v; o5 B

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • ' U* \* L( l3 S- l; F1 \

  • 1 i/ X4 F6 N7 |. p
  • 6 N6 R" R  D: P4 H
  • 5 i0 R: O, }3 R" F7 V$ {

  • & ?) d2 `! N* Z  @' Y3 S7 P

  • / \+ c0 ?, ]  m  S, U( R1 V5 W
  • 6 l' ^+ I$ d( A# i
  • 8 t4 S& A& H7 i& l$ }# y" M+ a* M

  • ( i8 p4 g2 A2 E' g; [
  • 1 f% J- h* [) s+ e# z, m4 ?# ^

  • $ @, F; G: u2 w, M7 Q; e% g
  • " m2 F& ]; A' Q
  • 0 k, `$ W; O! ]( g+ X

  • 0 k7 t7 @' p+ U8 e+ P, J

  • . e& J5 \* v% d& Q
  • - c3 U% O2 n7 L5 z2 c7 ]

  • " H# `/ q$ }7 o

  • + Z% {& H& K# N( y7 @: J4 y. \
  • 5 c" v: |, Q; _- o# P" V
  • ) z# f9 U3 g2 n( T3 d

  • . v( p8 o4 x4 a8 z7 }1 t4 l* ?/ K
  • 3 D! {% Q% M4 L
  • 5 V2 S$ z2 j  A& ~2 ~' \% Q: x6 I& M, L

    + i# q) o8 Y$ R: f. 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()' ?1 P+ X$ q& ~2 W$ T8 |  q

1da850d5cdd66b7f685d1f819c9f7321.png


3 ?8 o- A4 p, T" H% n4 C4 t8 S

* ?% b7 ]" Z4 t  ]3 p+ U2 L
                               
登录/注册后可看大图

7 A/ e$ }: b0 m6 h1 O0 l

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

回复

举报 使用道具

相关帖子

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