收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流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 y7 n8 m5 d/ |- O

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


5 c5 |' Z) I/ r+ i/ ?5 e/ n5 Y/ v

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • ; A: _$ S/ G6 K' B

    4 \; g4 g. J" Q2 V  `6 t

conda install Cartopy
$ S3 e3 I: i8 \

4 W- e: b, R7 t, _
) @$ n, ?6 {3 _* }! c
' ^" x( b3 D9 |5 a1 S; v! {" \

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

例1:


  • ' N( }/ T& {! m6 n
  • : Q# V: u7 i  v0 f, B

  • . C: B# k' N" T4 ~( a

  • ! F# R; h6 f" Z

  • . }) c- ^! Q2 \  v

  • , Y0 l( O& K- |1 b) l* s) s# [: D/ Z! y

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()6 H' j1 ]* P* Y: e

2856b94b0ff5bf4357137987d7c167b3.png


  • ! O: Z& J+ l/ n$ @8 S
  • 3 N  B9 _% L; t$ ?3 \, h5 V2 W

  • ; Y7 |$ r% C) y
  • ( m0 L8 E- [* g7 t% O6 Z

  • 8 v5 N& |6 Q5 @: G- `
  • & W* b/ Z, H1 u6 d
    # M0 O% s0 H% g& W* v4 Y0 b

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
( j2 W* y( l& I  k/ d" ?$ Y6 Y

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • $ V; @1 N# C/ ?! t5 k- ^5 I

  • & Z4 W  B' o8 E; x$ h# R
  • 5 I% `3 A  b0 g: v1 h' P' e
    . N) r# b/ W( J+ X- ~- g& @0 o5 h

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
$ c1 U( x2 f6 L& ~

  ~2 c/ A( h# G/ p

绘制时间序列图

例:以三角函数为例绘图


  • * G2 D- r" O! _4 O, V+ @( a7 r

  • $ b- l! }8 s2 m' c5 c
  • ) F: @7 g4 F8 G2 N3 V. C8 z$ g" c9 \+ @
  • % b3 k8 H% \+ j6 w# [1 o

  • 2 `/ u8 ?2 z6 k- x" r8 W
  • 9 V& w* n4 v# {/ G0 ^

  • " @, k9 B5 B+ P. a% M9 [  @% r

  • ; v! z: u) n0 q7 S2 g* O/ T: K  S
  • : S, R/ s% C* Q, r
  • 3 W# ]3 H8 J: C0 \

  • # T! B' G3 q( T0 I$ {
  • " W8 [: c. T# X

  • ( \( W7 V7 E' U9 [7 _
  • 3 A5 m- h. D9 q9 X& S
  • & x% B4 N5 h" Q) [

  • 3 S( X$ ~& }9 X; h0 V
  • 0 G% v' I5 ^  {

  • 2 _7 H2 P/ g+ o' O. T8 i
  • + n& }0 j. \, x2 \/ r# w4 R. |

  • + g( u! `- I5 v' y" z
    6 Y; |8 X' S8 \. }( a9 O2 h

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()
! M% f: J+ Y$ ]$ f. N: O0 N: I

7d0cd3e557628cb00d61b8a5a167f62f.png


  {+ r  b& w7 H' R. D; c( s) Z

- c5 g  a. o% s  e) \3 k3 M
                               
登录/注册后可看大图

& L1 B4 N( B  K0 C

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • . @$ I% ~1 T1 }  t! x7 M& C

  • 0 j2 ^: A4 x8 a& }" [# S+ Q

  • ; A8 G; j3 O. c0 b3 t
  • 1 a# z  y. |: [! `1 G

  • 6 w0 s: _. I# S; }

  • , t0 {( e) W! c' x& p; l
  • * d% z" ]$ A) c9 T& q5 f& ?
  • . w9 I4 v' ^7 T: Z) W% K

  • 0 \/ Z) [  ~5 `, P" C

  • 2 K9 T8 `0 M: ]" E$ e7 K9 }
  • 9 V2 H. w% G! X3 N9 H

  • ( Q7 `0 p. y& c+ Z0 m: p" h

  • $ f+ W7 V+ F+ h- M+ W

  • 8 |8 }* b* ]; [# E

  • ! P* x' O" x/ T- \" u" y" Y0 Q; Y
  • * q$ S0 s  }* r; s7 C1 x8 Z7 W' ~" H
  • 8 r) m/ j1 u( Y
  • % O( t- n) l7 Y6 w2 A

  • $ B" q' r2 }% s3 U9 n" }

  • 8 P0 l2 F( C1 i* s7 U# t

  • ! _& k$ Q& P: z7 C( ?/ X! G, ~" M7 N' S

  •   \, t+ q( |0 i; I& K
  •   F7 q% ~* x: j" b# m
    ; C' ~% k# X1 B

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()
) q4 t: t# X" ]

1da850d5cdd66b7f685d1f819c9f7321.png

2 s( _/ O: n9 W3 `* i9 p


# N: J4 R, {0 t8 l3 N                               
登录/注册后可看大图

( |9 W' |( R* I9 ~! v

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

回复

举报 使用道具

相关帖子

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