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

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

[复制链接]

温馨提示

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

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

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

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


$ n" R. @" I' E' }! p/ V

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


/ }0 y) i0 _( Q- l# A9 H

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • 1 b* X0 {* p( J& L8 ^2 l) g

    , R. ~9 Q# t( b, D3 ^+ J+ z7 u. t* F

conda install Cartopy0 B* |3 }% H2 K0 h- f& \

5 j, e+ H' G  U+ K! @

: Q5 e# y6 e$ \7 \2 q7 z
8 b6 ~, ?: @' e9 k8 o

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

例1:


  • " [0 s% m; D) K$ B% q
  • 1 O6 z' S4 v, r& D) w. H! y
  • " d$ O/ S" }2 ^! c3 [

  • 9 m( s9 ]3 U6 ^: w' P

  • 1 f7 {0 W$ {5 V8 a% C& R+ R1 y0 |
  • 6 i  l: \6 y8 d$ j& n5 U
    / O; X$ j& _( Q/ }, `* d! ]

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()  [5 r  P( F' M, z5 `3 [6 X

2856b94b0ff5bf4357137987d7c167b3.png



  • 3 i$ ~* q: Q7 R0 ], J
  • $ I6 x) U9 y& G' T$ B
  • # M0 {, F: k' x7 c
  • : j1 L5 r2 |/ R/ k. L6 |
  • 1 i, j0 M! L. G8 f3 Z

  • % ^8 e7 r) m4 G: W7 y& |) C
    ; r0 [9 s" J6 s1 C. m

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
6 E/ s# P4 E; ?$ t

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • * j% e6 o) R  x3 e/ m: i- _
  • ! U; K- N. G% i& P1 o
  • 3 Y1 |/ `0 N/ u; n' c, ]5 T8 z

    4 r' w2 X3 e  D% v9 c; u4 U

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片- ^3 V1 r( ^$ c! d' T# P3 F


( D0 _# h- O8 j

绘制时间序列图

例:以三角函数为例绘图


  • # A" ?2 t3 C$ b7 s6 w+ v! k) u/ c

  • 0 j0 T& b; P9 u) a; O
  • ; H! k$ I4 y* _6 o% ]5 h
  • ' y6 @) c2 l$ g8 R

  • ( `! d7 q! t' @. C

  • " U6 A6 R. B! S8 S7 Z$ }1 Y

  • . b4 G7 @1 x, ]* ]  S7 L! ^9 w

  • ' S1 Q) a- |" W& H" t. J

  • ( Z9 W, d' p/ n# I; R! S) o% W

  • 4 b& g! y! F" c5 _4 n5 I$ V  M6 u
  • , K8 Q  o/ D3 v2 e
  • 8 S* ~, Y* @  r6 {8 l

  • " l; ~; p7 K; v; ?" m0 O
  • ) ~+ L9 a8 Z9 c4 e6 @6 @

  • 0 Q8 q0 m* p* |7 Y# ^

  • 9 Q+ Y* L8 G5 r4 y
  • ) @( S9 Q7 p% o0 M! d

  • 1 T1 F# w" S7 F9 Z
  • 2 V1 J9 c2 c: t/ y

  • 3 t. y2 `' O8 T) B" w. f* d
    " c  b+ m; J+ t1 x( O7 k% \$ o

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()8 _, ?; Z$ K8 x

7d0cd3e557628cb00d61b8a5a167f62f.png


7 K6 s& r4 D5 V, X


: o/ D6 R; z3 R2 e9 r. ~, Z4 E2 k                               
登录/注册后可看大图

7 q& p4 N3 r+ \# _" o: e

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • / o9 w& I9 d) B7 S

  • $ a  a$ h( r  }8 e# _9 Y

  • ) V$ ~8 Y' x! E( T( t8 [2 x6 O

  • 1 G) `- d% M! L% t0 q" f, \/ Q
  • 6 e; `+ c8 j# R. H' S

  • ( K1 i' h: P# v4 S0 `5 v

  • ; U# w2 l  y- D6 h6 R( {; f
  • + G( Y6 [, S4 ^5 h/ z! H/ m& G$ A1 h
  • . T) I* V( H' J/ c
  • / t1 G, b4 r- X- e! s

  • & v" @* A' S; K- P

  • 0 E3 B+ C0 P- a0 }7 o" s  x& }4 K9 A

  • 9 f- Z6 d! _% l* L3 f' d7 S+ Q

  • 4 q9 Q* k$ a* q. |

  • 7 V0 Q0 I+ z0 U

  • ; ?& P* e$ L. S% o4 M
  • # X/ X* W6 ^1 G

  • 5 b' k' \) E7 y1 V
  • 7 }: s% w* z% S: s) U1 T, @$ Y7 [0 x

  • 8 o$ l: l0 c1 f# C- U9 O/ w) |5 V

  • & g8 T! T6 y, \" W) {4 z7 d+ E

  • " R5 v( u7 N0 u5 Z& C( X0 a7 Q
  • ' x- V1 K. V( L) M6 x. B: Z

    ! x9 E2 F( _: m" T0 O0 O, 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()
6 u. z  G( ?# `! q

1da850d5cdd66b7f685d1f819c9f7321.png


$ b  A, W! [; Z+ l$ p; f* ~

  a% c1 j! d& t3 X/ T! [
                               
登录/注册后可看大图

7 I6 A6 `' |5 o. ~2 a( l$ E

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

回复

举报 使用道具

相关帖子

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