收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流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 A: d$ N9 T& Z" H# n0 t# b

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

* u( F! `, h& Y: `

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • ! P2 k4 e7 a, H- F+ r6 K5 o
    1 F0 H) o' V2 k

conda install Cartopy# b% l1 e! [$ I7 ?9 T


0 d4 E- f" H$ U/ D
, v, J% a& N: j8 V* e( f2 I: Q2 g! f) @* v0 m

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

例1:


  • 8 Z& l; L7 A: z( q) A

  • * m7 D( e3 K6 E  k; E

  • % i& `. w1 Q- `0 w0 z( V8 e

  • ( ~4 h+ e) k9 W, \- A0 Z( Y; m

  • ' Q6 [- q/ l! Y6 M! ]4 O
  • ! q7 \6 ^5 j" P

    : v; |# ?# W9 L) i# d% h3 F

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
7 L2 m) h7 V7 K) w$ I  x5 P8 i2 s

2856b94b0ff5bf4357137987d7c167b3.png


  • 9 e! K" l& y4 M9 @) m

  • # F. f, s6 p% k; Y

  • 1 u2 z6 Z3 j' G- l

  • 5 N/ E! E3 P; d$ J

  •   y; u  k/ N0 z  _# _# Q8 q' _' n
  • ( t7 f5 p5 M+ m5 f; O2 z5 A

    ) Y6 i7 [- C) q, I- w

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
- W) C  `% K. \# e2 S% m3 q

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • & d2 f: P2 ]- N# L5 |
  • $ I* Y% j2 y) t# p7 P2 l
  • : Q( }! v1 c2 r, G# ~& N

    2 }8 V+ L) J. H. }! h4 D1 F

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
4 \" H' |- ]8 Y: y


7 r4 T; r" X: u& d9 ~

绘制时间序列图

例:以三角函数为例绘图

  • 0 q- B2 S4 s. j8 {

  • ; H6 [6 K  P/ x
  • , V' h8 V  a2 w* r4 F

  • ) f$ d. R, o/ ^6 \

  • , h0 W# o# j7 m
  • 3 O& o4 N( S3 g6 L
  • ) x8 ^$ \/ Y1 c
  • * Y; Z7 {% f/ X2 V" P' ~  m6 A

  • * G4 _: {9 K7 n/ t9 M

  • # `8 C/ B1 k- b6 v) q* L3 M

  • 2 v5 c! F' h. \6 A# [; w

  • : r7 F5 q3 V! ~5 X: y
  • ' f% x, u; g: I0 |- Y
  • 9 w+ h- i2 _8 n  g+ @! C2 H3 o

  • - L' `/ a# a1 i# J' R* N! Z: P
  • 5 X* e0 ^8 }/ M7 b. c
  • " N1 |- R' t: z* K& ^) \& z

  • . E6 y  y' ]- }% {
  • 8 V# y; G5 u4 |, I* M# [

  • ; D# c6 S% x$ u  @9 N
    - a! L1 R$ z8 g* `: 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(); {$ z6 z/ H. T8 m8 V2 r

7d0cd3e557628cb00d61b8a5a167f62f.png

  P+ `. Y- K  d: Y; `% F. e" B" O

! E. ]# Y8 y/ ~
                               
登录/注册后可看大图

8 U* o. v. p# j0 \3 r9 v6 D4 h# c

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • 6 X. J  I  L) I/ S1 i' l
  • $ F9 P2 Q6 ]# v

  • + n" a* A7 a: }$ s0 {: N

  • + x$ {! _, V4 [8 D0 W0 F/ H
  • , a4 ~8 D7 |  [3 n- C
  • / s7 I  l$ `, }, `* \! g5 W8 m& U
  • ) e7 a: B% l  n0 u3 U3 s
  • 2 c- f7 p" D' Q+ k3 R  x
  • 2 F9 S# \* V$ r3 ^$ `
  • ( J7 t  j  K0 o1 p# S- D! B# T

  • / s: P1 J2 e1 r& ~

  • / S  |& o$ o) Y0 Q( N; j3 C
  • 2 \1 m$ Z5 C% m4 l. b
  • $ L' d6 S; _9 D# K

  • . I/ Z9 X7 L# X4 K; G$ P9 R

  • 2 r* G2 K$ @0 c3 V. {6 P

  • , D  j1 d; l$ M
  • 5 ?& K6 _5 a3 ?0 _1 _  Y

  • / E5 ~4 ~+ @+ r$ `3 ]* a9 D
  • / K; R9 {0 v' V

  • 5 I. J% L) Q9 p& L+ k: T* M3 H6 A- ^

  • + a* h' `+ h4 x4 P2 U# [7 A

  • 4 B- R3 L4 E+ R4 f% I& v9 ]
    / H; t! ~& Q  g- E

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()4 ]5 G$ b" o. b- j; R

1da850d5cdd66b7f685d1f819c9f7321.png

) U: T3 h5 _/ a+ `9 w


5 S4 _8 A' y6 s' M# N' j0 t                               
登录/注册后可看大图


" S6 r: x/ X$ ?0 J" }

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

回复

举报 使用道具

相关帖子

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