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

[复制链接]

温馨提示

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

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

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

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

' }6 O2 W' P8 R1 I$ e

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


, M* G/ j: a" B: b/ `4 P

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • ' n' }! q# k1 f( t, f3 V  a
    , t6 B- O3 ], F, k& d% l& ~

conda install Cartopy
1 N- ^" u) h8 ]/ U0 r) O

! D( P: v; U3 v, Z. N/ S& K
; M( n& P/ h! y
- R6 Z. K  F1 z1 B0 {" w- }

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

例1:

  • 8 x+ l1 P) C1 G

  • ! Z( Z& `3 T; X: x$ i

  • % G0 [. n6 P% q# `. D" A) x
  • * n6 E: k  W3 \- K: Z

  • 3 i- G7 ^3 ?* Q; c
  • 9 U* c5 h6 G" t6 H

    0 d# \* c+ k& Q( C

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
- y* L- Q. {  v0 o

2856b94b0ff5bf4357137987d7c167b3.png



  • 1 p! {$ z0 T1 I& i7 E
  • 4 L9 L4 z/ M7 R# u' {; r6 B$ V. E

  • 5 C5 u, a- |$ x) w2 w4 }

  • # \9 p" G9 A$ J' f
  • / Q2 z- ?3 O6 w' R) d2 `
  • 4 u3 l( a# E8 y( f# T
    + `/ f; O3 Z3 M9 r, G  o8 Q

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()2 E) B* m+ V* E# r8 O. v3 u9 L8 j; T6 n

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • & c3 v5 U7 v4 X6 R& d2 [/ J
  • 0 s7 W8 s' M: @1 o) }

  • $ y6 j0 M4 ?, z6 ~
    3 e' L5 D7 o% m. S( }+ T4 E

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片% J, c; w. R* `0 A9 _3 v

* ]+ p9 q9 h- ^6 e

绘制时间序列图

例:以三角函数为例绘图


  • % x6 `$ W  U( k9 v8 \" D7 d" B

  • 3 A5 r& v7 N; a2 Q, p
  • " S/ L+ u! y9 Q1 v9 H. x" U
  • ( j9 a! k7 G3 a9 s7 K

  • 5 m; s6 g6 S: X4 Q7 T" e8 w0 x
  • - y7 y/ u& M# S" c. Y9 @( l

  • 2 o1 ~) C: M4 O: `
  • 9 r+ y3 a; q# L9 ?* ^; s2 V
  • 3 ]7 z4 ^* O3 _* x
  • 9 r' }! U/ K" s4 v
  • - t& e0 C2 z5 }5 }/ b! U  B
  • $ {  [1 _! C4 s1 q! D' ~/ U

  • 7 @# x* Y# W! ?8 @1 u% F  m
  • + n* B# v1 q$ I0 }

  • ( l2 s! m7 \! C7 S2 ?: U
  • 9 w6 M* P; g. p; K8 `

  • ( u2 C3 P0 }! v
  •   ?# w& O1 A' m

  • 3 R2 o* z, u- y

  • 4 A7 F7 Z+ u1 ~7 F' L/ g; [$ P' z$ L% C" k/ q& {+ L  w8 |! s

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()1 K4 a, b/ z' D5 U7 z

7d0cd3e557628cb00d61b8a5a167f62f.png

; J3 Y7 J* H8 [) N) [8 f3 d

" y3 C! i+ v& V# L) {3 Y
                               
登录/注册后可看大图

, _) e2 N6 G4 N- ^7 L9 h) b" J

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • , z" A* G& C2 C9 }8 z: J) Y
  • * e# q& l" d) g' p9 D8 ]
  • 9 N% c: F+ r7 ~7 b5 W
  • 5 ]# A6 f- D/ a( H

  • - w' k7 }* A+ A0 ^# d/ x4 X
  • 7 ^7 z9 S+ J' ^0 d. z' K

  • ! P2 b% a4 a" w

  • 6 b" v3 K; Y/ c6 G1 T8 x" q

  • " ^% O1 I/ p3 c

  • 4 @" K0 [1 s  g* J% h
  • - L( V, O; p6 }: Q0 D
  • ' H+ \* f  v. b

  • ! S" T# R+ [, }4 W. [6 V3 U; `
  • 0 ~/ i. E+ a7 S( d  c& \
  • 2 d0 F7 A. v5 a7 t; R$ p$ D$ p) _" d

  • 6 i" D5 K4 b8 t! |
  • $ D9 R7 o! l' W9 E0 m, }

  • 2 n1 B# n( J1 `, G  K6 G

  • ; f; z7 ]9 R/ k, v1 J
  • - u- S. _: p+ @. N' w
  • ) N& P7 c- C" t, j+ l1 Z8 y
  • 0 A) O' a7 b; ]" p1 W( F. F
  • * z& z& m( x0 f0 w5 o

    & @( S: I4 z; G  E/ f

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()
) [% G( d1 a  \" ]: y

1da850d5cdd66b7f685d1f819c9f7321.png

+ {% H1 f# _' d3 ~' ?7 C1 S


) [( M( z! N/ Z' J$ h8 J                               
登录/注册后可看大图


: o+ o6 V" l1 x3 W6 O0 m6 C

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

相关帖子

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