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

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

[复制链接]

温馨提示

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

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

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

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

$ o3 j. B- p8 u5 ~+ @

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

9 A$ _2 z# p  A4 V

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • ; f) N2 z9 ~9 y+ s) A7 @, N, B0 C" D- V% e! M; o; D4 u7 S

conda install Cartopy* |' @; b# G7 N, v  H$ @

6 e/ B! \! x+ H: b* P
6 R5 y# w% k, `9 u* S
; X! |. _+ ?  X2 L/ m3 c% Q

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

例1:

  •   g+ |$ L2 x' Y0 U; H( u8 ^# H* y* R

  • 0 {) i, c5 w8 X+ q* Q! o1 i- m

  • " c! L4 B# ~; X6 J0 ^3 j
  • & u2 G( i- }- t9 `9 o' Q- n6 s
  • / R( M6 d% v2 @# X$ G0 X; `/ ?, g
  • % W+ \% H; q5 `6 W2 ]1 ]
    2 m# h6 z* W3 W: Z# ~4 f

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()0 `1 ^8 R; Z  J. d) m4 f: l, I

2856b94b0ff5bf4357137987d7c167b3.png



  • + |. C" z4 S3 X" a' U$ `

  • % G: b7 x, e" Q  r8 e+ y& E

  • + ?+ G% B$ K, ]( [( j
  •   ~. [4 C; F, S, H1 w$ }
  • 0 `, L4 X& A7 f) }+ @
  • 8 ~) Q) Q3 V: E! P0 O* T7 M

    ) B' H: c2 @5 O/ i

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
, F7 N! k4 I2 e

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 5 F/ Z- w( t* e+ i5 U

  • + H$ ~) @* Z* w& {

  • 3 F2 v  p# k! T3 m2 T; X* v) c& j

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
/ v# h8 x' j  s6 {7 U4 X( U

; b% C5 [' o. }* s7 F

绘制时间序列图

例:以三角函数为例绘图

  • ; d: B' ~( @$ [9 v$ z
  • $ q8 o% W+ n' H6 J

  • ) \' E6 X& [( b+ k. D) I8 G
  • ' R7 S3 S! o/ O- h8 R
  • # F2 e2 A0 _7 o# _2 ]6 p4 v  v

  • 9 o" |7 ~& s3 _6 s
  • ) c% r: r2 ~5 W% o3 ~
  • * R- n. y% u3 }) a" V- a0 n

  • ) z1 G1 q' ]9 l' C4 `

  • - A; J  n7 g- ~1 p

  • : @8 A' e8 `3 r
  • 5 i( g8 Y1 Y. m' F( s0 f- ]4 O& T6 F

  • " n( |! u3 E7 W& f; B7 p' v

  • ' ^8 f  [& \+ \

  • 1 |+ }% p/ Y* L

  • 5 z4 C' S$ h6 |

  • 9 P6 U1 G1 J  `. ^- i
  • 5 q: C% [7 B! g" q
  • * A% x) h" q/ a0 K+ L8 G( {. Y

  • ; m. n( X0 E# Z3 `; N
    3 t: L! h; b. B+ x* H

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()
7 O, Z+ _: _, Z& y% g  D

7d0cd3e557628cb00d61b8a5a167f62f.png

5 J4 @3 T5 ~9 y$ v4 N0 P9 c

' Z% E' {! O. b2 l) b& n% k
                               
登录/注册后可看大图


: N4 l/ a: P5 o

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • & u  h: n8 q) ^& a% m* k5 f

  • . \/ K" ]7 }# T. E9 a8 `
  • 3 I$ d" R  A% [: h! w3 t$ B

  • $ B4 ^& N  }# u

  • 6 O8 Z" B: |3 A: y; d" r5 Z3 W
  • ) O/ D$ l# ]* i& ^3 Y1 M

  • / W; q8 C2 ]) \: q" X7 a( F3 [
  • ) W: Y6 Z1 P  I' e& Y

  • 9 w3 a' s4 F+ F

  • + h* H$ z6 J+ h4 Y

  • , o, F- i: K5 x/ j

  • , w+ u% d  N1 t( n  ~) T

  • ( M  @8 i; R9 \9 u, F, C' l/ P% J

  • & n* ^9 p2 `+ |
  • / X+ M2 A4 J! x1 n5 P. Z
  • % ?  ^: J" [* h, f& z2 W% w( J

  • 8 r1 B+ K0 S: Q' G3 ~
  • 9 e0 b% }' {5 e6 }( |0 j+ Q$ `
  • 6 v$ @7 P/ H9 ^! B$ K: \

  • 7 a7 y( r& |  g8 B7 l0 Q  j

  • ) R% {8 }( K' }! x& f: S

  • " q; ^. @; h& I4 C) T$ ~
  • ) O$ X7 D# L1 `1 B% R7 x
    : P6 _5 A8 P1 S  z# v* d3 P9 p

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()
# n# \+ V( \" S, ^0 _

1da850d5cdd66b7f685d1f819c9f7321.png


" M4 ]3 P, H& Z' f! t

- a5 n! P+ {6 m8 L& H
                               
登录/注册后可看大图

: V4 A, N# i& f

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

回复

举报 使用道具

相关帖子

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