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

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

[复制链接]

温馨提示

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

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

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

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

0 N  M/ D: _4 T! S  L: C

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


( l# i! L3 e! b8 i6 J( {$ I3 z

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • 0 k' B. Z. d& r# B0 {' D* h

    $ e, F' g! c: ?' T

conda install Cartopy8 @' h2 k3 D: S& O2 N1 @! B

$ A/ h3 C) n! [- L! @
8 f' i* q# C4 [2 @  w5 o8 c
! z  h# [) C6 ]) X) T

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

例1:

  • - Y- j4 m7 X$ P$ n9 N1 [& P9 N
  • ) {& R2 Q% H6 b) n

  • * E% a% x/ q; }) J, w* g" D
  •   U! ~) p2 u$ v- B( D) c5 A
  • 7 b3 i  {* X; @6 c
  • & ~) S$ d- I/ a, t7 p' T7 R
    + y. s  b* e6 L7 M1 d$ O

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
5 T) W) D  ]( e, l

2856b94b0ff5bf4357137987d7c167b3.png



  • * O5 X+ p8 B" Z. v, W( d

  • - v9 @6 v, Z" ]

  • 0 K7 o& x( m! T3 n* {( |9 N4 N" ^, o

  • ' b/ E5 }2 D6 D- [7 Z- {
  • ' `+ `) n( `2 X) H, j6 c6 ^; r
  • 3 G$ U1 i1 `% S# c. u. k

    & U1 ^" U* a" X: W' F, n5 ~

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
" r8 l7 V- r1 l2 K0 V6 d& z, [

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • / D" H% Y0 C* ]
  • ( R6 D1 R; H9 x  I

  • 6 R, j, l2 e  E! o3 U1 M- `% P
    / {, n! R. E1 a: T, n: Q, t

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
6 d4 M; p2 `- b* b: C

0 l. _$ \( O0 U& m  \& J

绘制时间序列图

例:以三角函数为例绘图


  • * h$ |, q- Y8 z" A& B
  • : O! ~; D& v3 L2 h
  • , Z: T) X2 z, |5 C5 b3 o6 w1 a
  • ! Q# Q( D+ x) c  }+ q: H, }- p5 z- m9 p

  • 0 }* u# M2 w7 _+ t2 j
  • $ n9 J& V1 V% b+ Q

  • , l. g) ]- s8 k

  • ; i1 D8 \  Y* F9 i$ \$ d, N! P
  • 9 Z# P& x2 t9 H4 ?

  • . z/ q) V% W  P; a- O) _
  • : U; Z& @4 O- [- N

  • $ Q# z+ v& c: Y7 Y  D: u! c8 K' y

  • 6 j, N  r6 K- \+ z; F1 L

  •   R2 k) ?# `: E" a
  • 5 R, X. N, R5 E6 `3 g

  • 1 ^, N) o) J" A, @# M! V
  • ( E$ @# J# S: C! \/ d+ G

  • 6 p* {% O* o# w/ m
  • ! t! B: v& h5 m: ~6 O- w

  • 4 t+ A# t7 I' o  r/ g& P% m4 V
    8 X! R1 d) V( K4 M8 J' D; ^9 j

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 U. K) z7 v  e

7d0cd3e557628cb00d61b8a5a167f62f.png

" V" _' Q9 s4 N% H

  J7 P  U5 g4 y2 C
                               
登录/注册后可看大图

8 z& u- }" u) y* i! m0 c4 Z. L

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • . H' v# }, W) H% M

  • " j" D+ {0 k/ X
  •   d3 P  a- c' s' _
  • " A" W. v) y+ r9 |

  • 9 |% S' _( E+ o/ ?# _4 P# T
  • - O  c6 D& Z, i) e, k$ Q, C
  • 9 G" P# S6 l  {: ^' U
  • 3 w) z3 R+ g% o. X) s

  • & J2 [" p: A' h1 O' }) x' R  G

  • 3 N9 W5 [7 q: J

  • * h- y2 Q/ H2 ^

  • ( S/ B9 Q$ C7 I' I' ~" e5 {- g

  • 9 D6 l3 t! j/ N/ U. k2 D" i, W
  •   D. d2 r0 A, G, F) H
  • # G7 r9 j9 ?' R
  • ( C. _6 |5 G' l& k+ h( L

  • 7 y- Z: V; k# v! B  p: J

  • ! p. z7 l" f: X% Q

  • 9 ~' H  ~" S4 R) @

  • # W! c5 S* f! r# q
  • : c8 D  {- l. v

  • ) L" D3 X7 J& I, A% {# Y
  • - I) M0 _1 V/ y0 t. y  e

    ) [: J8 L% S7 C2 j

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()
% U( u9 A+ H( u5 G

1da850d5cdd66b7f685d1f819c9f7321.png

- Y1 C" I/ C) |7 a4 r* {


5 b9 D6 `9 @6 E# h2 @  K: F                               
登录/注册后可看大图


0 \, J, ~6 F$ A

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

回复

举报 使用道具

相关帖子

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