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

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

[复制链接]

温馨提示

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

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

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

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

3 q, P$ T: u$ B* f+ G

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


4 ]( |# b8 g0 O( V

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • 0 m! w. M1 ?+ f0 }$ V# o1 I

    + z7 J% ]$ }* F2 o8 O- L. J

conda install Cartopy
8 ]7 P9 Q  p" ^* w- L# f5 Y$ S7 T


, @+ B' F9 x9 f& d: N/ }& @- j! T6 ?; C5 c' s9 K* o0 `8 j
4 I. o9 w7 n" g0 i3 q: j( Z: \  F

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

例1:


  • 3 t# S& J" m: F
  • ! D8 {8 @8 p! e5 N9 f. F/ e

  • : Q2 ~8 a3 y% B: s  D# _- e+ X
  • ! O) x& i8 ]) ~1 H
  • 1 M, @( O! Z! s* V! g. n

  • 2 v# L/ `: R! ^8 h6 T% v6 S, ]% C, ]$ }+ d, u2 m% U4 m

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()3 [; e7 c! {! ?! L

2856b94b0ff5bf4357137987d7c167b3.png



  • 5 w+ a& C2 g3 V9 i% A
  • / Q9 i, \: |" p0 b- Q! R, U/ U/ ^/ X
  • : S9 {! [% R) Q  c& N

  • 1 ~. }1 m( V% C, ]# \

  • 0 `( L6 i. \' E9 z

  • # F( Y; O7 B, d" t" T# I- N) O4 r# C0 H7 X* `' S* ?

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
: N1 U: R5 l4 e- d4 x5 U

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • 3 b# W9 O6 f4 p$ I

  • 4 m# m4 }$ b# e/ ?2 b- A9 A

  • 5 h8 K  c. i# p9 V" d$ h9 g
    # F$ D* F$ E+ \. H4 y% B" b1 G

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
8 _. w$ d2 B5 V$ a, z! h- V

; h0 e4 r' z3 r( r* a

绘制时间序列图

例:以三角函数为例绘图

  • # O& s9 ?7 }* N  p
  • 1 n7 [, K) x1 `. W

  • 6 s* A9 {3 n% A0 _3 |

  • . Y; H3 q4 s  D: U. S
  • 9 `5 L( e5 Q' \1 N: R

  • " D, {: [4 Q5 }+ K! B

  • 6 A' R5 _9 e( U, i+ n

  • / p' ?( m2 L2 ~/ `% t3 S" h

  • 6 y9 F* u* j# T3 w. c! J
  • 0 Q% T0 }/ I" n7 \

  • / t( n; H! `* O' l6 V7 H

  • 9 z3 _3 q$ u; e1 E8 P) S. {8 x

  • 9 k! S* q7 @  @+ V! h' I

  • 2 A1 x) Q5 g- t$ u5 O9 K6 `" r

  • . P: Q1 U# t0 F7 k- [: o' A* x
  • 9 U, |6 D) g1 Z4 U% L/ {% t4 B3 X
  • * E0 W( S) C9 w0 i2 ~

  • + F  }0 }7 A  ?! `3 c5 Q: U) S
  • 6 j! d# b+ T5 k* Y- I: ], }( }

  • ' {* s0 Y; f. v8 [2 f7 u5 k) d: }2 O( l2 ~" T" f

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()
( B$ H' I- i% v' Q5 @& M6 ?8 w

7d0cd3e557628cb00d61b8a5a167f62f.png

2 h3 g9 P! R. S


2 O* L/ q" ~! L5 a; Y                               
登录/注册后可看大图


1 R' M' L  N9 r% J! ?! k4 E6 H

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • ( D8 \' v# i2 _# a
  •   U* {: ^0 Y) j9 n
  • : ^2 k) R- b9 \

  • 2 f3 ^3 F/ e+ T: r7 a( F' e
  • $ _/ [- `1 ^5 J" g

  • + ~+ _4 C# x# z  V' G) I0 t

  • * M/ x7 _- T( B: X- x
  • ! d+ R' g1 `3 l+ Q# ]5 n

  • ) P1 |, T% S( x9 y, D" b! f
  • ! s; e! H# y- W& `1 e

  • ' w- d* g) T' t3 N* m3 ^
  • ' d/ _: _; e" h
  • ' G2 I* E' ~/ ]7 u
  • 6 n8 B& F+ b6 G! P
  • 3 X# ~" {6 V0 r# ~" x+ N
  • 2 J# B1 E9 Y' k+ o  h

  • : Y$ Z8 V) O4 r; y
  • + i. ^& ]' U4 V# j2 B

  • 1 ~6 k5 J0 a5 V; H7 U! d2 }3 N

  •   C9 y9 a4 {- j# n6 A

  • 2 z* s7 ^* c- L* L  p! k6 F) I
  • 6 c' l& \, }5 [

  • + _0 [* X) L) W) u$ ?6 T* ]
    . L- z: Y# Y$ b, o: Q

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 g( P3 s) {$ h: I' c

1da850d5cdd66b7f685d1f819c9f7321.png

& W' X$ O/ ?" m, d& ?

8 R9 }. ~2 t: Z. L/ C/ y
                               
登录/注册后可看大图


/ o9 W  o: s; G6 U" ~' w' ~

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

回复

举报 使用道具

相关帖子

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