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

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

[复制链接]

温馨提示

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

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

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

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

* }& A/ i0 Q# Z# [1 A, Z! n' P, A5 Q

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

. k$ }8 V& N9 k; |* e& g  z

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • 7 s% k8 K4 G: B3 Q1 k$ E& Z0 j0 I

    7 r0 _4 i( G8 X( w

conda install Cartopy
* J5 p- f( {7 |  c

9 ~$ L/ C( K2 w, I, R2 @$ S
* _+ O1 g0 M3 a& _* H9 c

+ t3 V2 {0 N5 a4 }' r

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

例1:

  • ' s/ u2 j* U. |5 V( t: ?
  • - m2 U9 r, |/ J9 Q, Q9 j
  • $ n4 r" x7 }4 r; |

  • 1 ?) N- b/ Q, `- P
  • " u) d+ L' r. Y, g& i( h9 W
  • 8 I% i' L/ t5 J
    % r$ L/ W5 i# Q# s2 U; t& b* a8 q. {

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()* x3 q2 W' b3 \! @, c; \7 B

2856b94b0ff5bf4357137987d7c167b3.png



  • ) R5 k5 l( ~) ~; u; L

  • ; S( c; c# p2 e# f9 `' d; ^6 b; }/ n
  • - c* m" g( s0 A$ I+ M

  • , t/ P) [( S, o5 @+ r3 p* O

  • ) Q3 g; p0 z0 \- F
  • " e7 L+ c; P. t- ]$ k  y' W: ^

    % D1 f3 a' p: _: H

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
! n) u; L, E; G( @

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 3 H, o; t, P# P# I1 q

  • 0 k% }6 J$ A  F# Z) K* [
  • , g! J# c7 m* P& M. z

    : `5 M& w$ I! u* H  K+ Z! `# c* q

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片; ^; r/ V, j2 `7 [: c+ H3 Q! @# x

, D! Z7 N+ q5 Z3 [, _" i6 K

绘制时间序列图

例:以三角函数为例绘图

  • $ l" x0 d: H$ k& b8 V. z+ N

  • 5 Q5 F$ A( Y0 I2 m
  •   y, F& c+ G- a% `2 `- R

  • / S( W! l4 [: x& U% e, }1 h

  • 9 r+ N% e2 e. k

  • + a! {/ f- ?: C

  • " |; N+ G( P% P) L* k% B7 t

  • 7 C5 ~+ E3 |- U" Y1 ^

  • 9 ^5 [3 {: R; [5 Y- @! z. b
  • - @6 u( T0 \# f  c2 b# R  K. R8 C  j
  • - c* F. L9 Z/ t- ~) V. ?
  • 3 g8 M7 \- H' Q  Q+ e4 ^0 b

  • 4 O. G/ i' P8 o6 @9 }/ J# ]' B
  • , |, d1 I' {% Q' X4 Q9 e4 d
  • 6 ^+ {: ?, w9 h2 P# L( z
  • 5 V! w8 e* B( V( m
  • - ]8 {6 ^+ f/ A4 v# Y+ h# f

  • $ j; r+ n% O" Y- K3 H$ j4 }
  • 4 e( Z  @. T: }& W* u

  • " N# a0 c( I* r; D% B2 f# b8 I
    - _; _; R6 v" K! D! b

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()5 O2 @4 k3 G6 d, I5 ]6 m* k

7d0cd3e557628cb00d61b8a5a167f62f.png


: j) X) }+ y( e2 l' ?


" Z0 B% f, p- B; z' g* j& v                               
登录/注册后可看大图

* |! k1 u: q2 w- a) _$ T

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  •   x+ L/ J: N3 C; H

  • 6 m8 b! |/ {4 _: p- f

  • " x5 n4 \6 Z- O3 m+ s/ M2 _0 i

  • - n  S  j7 q" A: M+ c
  • $ r+ r  }  C, Y/ i' \

  • 5 K# ~+ Q" t; m5 H1 g
  • 5 {1 \; H( y9 k# ~8 [8 `% X7 ?
  • . K6 U" G! t/ W  m: L4 l# f. n
  • 9 @0 V" T1 G& g! V, Y) ~

  • & i7 r# F4 K+ r! T
  • 9 y7 t7 n: W6 ^

  • % B# _# G- [! Y% l' u. F

  • 5 r& P- N+ h. a: a) X; Y
  • 2 M+ |: S$ Z6 J- |
  • 2 ]2 t3 W" f3 r* ?# o% E( j& ^

  • / L9 R, @) P/ v3 X! b
  • 9 Z8 T8 x- r; u8 T
  • 0 L& X4 n" b; z# H

  • : V6 V" O+ q8 p1 [3 ~8 }% h6 Q

  • ( p, M4 I2 }+ q& E: `
  • 7 q3 Z5 d' q1 {2 R1 I3 l( W
  • 3 P7 C8 f0 R. n+ y* l" A" H: w

  • , r2 q- ^4 Y5 D+ K9 d/ h3 h, }. i- Y% I% o0 n

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( q4 e8 k& X' f' h7 U- I

1da850d5cdd66b7f685d1f819c9f7321.png


9 ^4 ~; M. r6 ~$ K7 y

0 k" [4 F4 n) A0 a" S6 |  E, O
                               
登录/注册后可看大图


- p$ s) n5 I/ ^

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

回复

举报 使用道具

相关帖子

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