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

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

[复制链接]

温馨提示

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

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

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

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


: `4 [7 m5 f  f8 N4 H

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

% D8 Y2 H! F5 p+ Y/ ?5 M

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • ) a8 F6 `3 J+ W4 ~$ w- ]3 g3 U
    . m: p6 k8 W1 {( P$ @9 G9 ?, X

conda install Cartopy
" l+ o% r8 A( E( _" H


$ `4 L6 V* z3 x' T& ~7 S; _8 W9 f0 G0 l

4 |) m7 V& ~) ]- v! f& v% `/ f, e

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

例1:


  • - l+ o! U5 X! Z* |+ A/ }

  • ) e6 t+ G) `1 i- C* |

  • 3 Z  @3 l* I" K

  • # @0 ~+ J# S$ H

  • # _1 ~. y9 Y7 b

  • 8 q, ]2 z$ [, F6 E/ \# Y9 z2 j4 ~9 ~. }4 T' v+ c

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
$ s6 r0 X- R* y( h% w

2856b94b0ff5bf4357137987d7c167b3.png


  •   \6 J/ ~" K' ~4 K" [: c! _3 R/ X

  • % ]' X2 e; T- f, Z
  • 7 _9 y  F) b2 D

  • & O2 r& r  ]3 u2 m6 C0 X. K3 t8 c
  • 2 Y  J, C7 V3 E5 ]4 D$ f2 h5 v

  • . S. Q0 D2 f# v! l0 _3 h+ Z* b8 v( p5 y- K2 e

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
. s( o7 p2 ]$ M7 ^4 K) y1 H  L: F9 T

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • + t4 \; A/ d# K* o
  • 2 s. N* y1 y' ^5 s. H" r
  • 0 c+ N+ m( E, d0 }5 s

    ; v5 D: c- Y, Q

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片( z8 n$ f$ X, `

; C: V6 z. U/ U7 m4 ]! m- U) q

绘制时间序列图

例:以三角函数为例绘图

  • # O4 S  l- o# R( p
  • & O4 v9 h% P3 f% I; Y
  • " t2 l/ `3 N9 o7 M0 _* o. B  H3 m
  • ; Y- I5 @% x7 v1 n: l1 N

  • % B& V. n8 K2 g5 h  ]6 m+ ~5 {8 Z. s

  • 7 q: T% v  X9 J& s% O1 M
  • " P, V* y. f2 x2 v6 ]
  • / d- W) ]! o, M- b  W9 J
  • 6 X7 @4 ^8 y0 g4 ~
  • 1 `  ], n: {* U3 q5 i+ \* P6 H" a: i

  • , X$ X: ]5 `* H: b" Z# E

  • ( n7 Q+ D% W" t( V9 I( ?0 y
  • 6 q6 a0 y" S) W/ q4 q! C
  • $ a: R) q+ Y+ t, W

  •   N* ^7 C  g8 |3 G5 @
  • 8 a- G3 s- m& w9 o

  • 1 c* o8 f/ J7 u+ B3 J

  • ) S3 z' i4 K$ `+ S5 d5 n# f
  • 8 z2 l  q" a( O- w
  • 9 Q8 y' t7 J) l1 l

    ' L! [& \5 p* 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()
- B% W6 l: |% ?9 D/ q9 v. @

7d0cd3e557628cb00d61b8a5a167f62f.png


8 u4 I! E3 O7 ]9 c& x


$ t6 L9 p% C% T5 \; s                               
登录/注册后可看大图


) L) }4 |, B! Z

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • 5 g9 H6 f  q& n  |4 f
  • 1 Q' E$ G8 o9 t) C" @

  • $ a+ j. l8 ]9 k( u
  • 1 U$ ~/ f7 O7 V" ~3 B. P* o3 K
  • 6 F7 _% V+ b0 N2 |

  • ( i" d+ x, H4 \, N" K$ N

  • - m( g: L( v8 _; E5 [
  • & L2 f( a% S& H6 E4 j- ~& @
  • 0 {  K. h3 b" w6 o

  • 4 H9 a' P/ V7 h& ^
  • ' |# l7 G1 f: z, V# Z0 ]- y

  • ; Q4 u* X( _2 |( Q7 P7 }0 P: A' Z
  • , w, B! A- k* C2 Y! ]2 N1 E  t

  • 9 u% _. _! k: x: t% y8 z& X

  • ! t: j$ k+ I: A6 x$ \0 ?) K* T

  • ) Q7 n/ \; o$ P

  • - C  H9 u! B' W3 k3 g' q! h; Z

  • - o: o6 r9 r! A) _% j" p" _: @

  • % l% @- }  g* ~  w2 n
  • + W/ ?6 U* l+ P( @

  • , v& S; i' {8 d& K8 k2 ?  f

  • 2 W, Q. H3 q9 h

  •   P+ o+ }  H, J3 u* p! @. O5 i5 Q/ I. b: {

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()' D2 ^( l' C8 ]2 l/ X- z( j

1da850d5cdd66b7f685d1f819c9f7321.png

$ o2 ]& \$ c7 P  b- I1 F0 U. T; _

" q$ j7 g( ]. s9 \! S
                               
登录/注册后可看大图


' K% v9 N4 ^) H0 P  E$ S* Q1 \

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

回复

举报 使用道具

相关帖子

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