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

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

[复制链接]

温馨提示

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

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

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

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

7 s' s* ^% c2 v' v- l

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


* N1 m7 M9 R5 Y8 r# n! J% m+ h

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • / L. V% `7 J# n/ _: p
    4 ~  y# ^' J) P8 b6 o; w8 R* j

conda install Cartopy
( d8 `9 z! z- A5 e2 u

# ^3 r( s9 Q% `2 t

- u  A8 `. j) I" ], q8 [5 l2 F6 P7 v0 {" @

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

例1:


  • 2 q5 r' l: E/ N+ s9 H7 i# C% B

  • 6 {# r* ~+ K0 r8 F! o
  • ( O9 b+ C! k2 ]6 H9 e* J. S% t
  • 6 A9 n7 n: |; O
  • 8 X! `' a4 R2 }8 o5 ^* |( S0 Y/ f
  • + ?& M" L* N) ^( A
    6 Q) ^  w! k, c

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()' n  `, K6 x& D) Q5 y: T; S

2856b94b0ff5bf4357137987d7c167b3.png


  • " N: {5 t6 ]% X# [
  • - f# l4 Q2 {% o8 j2 C) n% u. C5 `, g
  • 8 N- x" w4 B( e7 l0 H- D
  • 8 r) }0 K, A4 X2 b- m

  • " U% s5 V( n  N+ l

  • ! K& k: }2 Q" O5 U/ q% D
    & L* c. `* B( U$ H3 ~) a

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()% w2 ^+ N" v5 S

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • ( b; X3 D) }; H" |9 k- W

  • 4 V: o3 x& g! K7 X* C

  • ( c3 A' l  I1 e3 S
    - G" f. n  P' e, V6 i

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片" |3 t9 i6 L2 r) y9 ^

, y8 Q: y; R0 ~& E+ B

绘制时间序列图

例:以三角函数为例绘图

  • * @! `7 r) b& ?; H5 x
  • ) y; `- W' s% X1 W. |9 u

  • 6 B- F  b) m- s7 M

  • 1 h$ q) J/ `. J0 F$ f

  • 0 @2 w& T/ i8 H% z# l- ^/ n
  • * W# B1 O; m* j' y9 b

  • ; ~3 S, s& H' o: E5 [

  • $ H7 N" D$ f4 k' I% C- ?7 @! f
  • $ v6 O* V, \  M+ N$ M$ x/ v2 f; `! }
  • + c1 s+ |2 e! I( q

  • ' v3 C+ T. n9 s! X1 E
  • ; G* N$ T' q, C* ?+ y

  •   O9 f+ x* i5 H
  • 4 t+ [0 F+ s1 k2 Q% C/ [: f6 K
  • 0 F0 E2 \1 i+ f5 D- O( e# N

  • " W4 p0 Y( t/ q9 N) b

  • 6 w) S! {8 C! p( O; u, z
  • 7 D$ O) a- |4 k, r5 o7 V, n

  • 4 m+ a" ]0 Y# t- a
  • % x7 h0 U! [; B; U' O$ N8 v, f( }
    * p% P. s3 @7 m" k  W/ 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()' W: ~2 N* J" H: Q$ g& r

7d0cd3e557628cb00d61b8a5a167f62f.png


7 k- p, T. [2 R3 K% r

# R* x8 k5 D+ S$ |
                               
登录/注册后可看大图


! T9 m. w, M' m/ N- i, k1 L6 I

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • , H! L0 C# Q9 i9 l# F& o8 ?) Q

  • " ?4 u1 v7 X; Y, Q4 H! R5 k
  • - D$ x+ h: p/ u0 C4 n5 d- _

  • $ w' ~6 l& t# F

  • 7 V5 q6 k: N' _. f8 ^; h

  • ' `2 B# ^+ @/ i, z0 [
  • $ [& R4 a  E& ?4 Y
  • 4 n# x- \) y/ R
  • * l! V1 }. y, r+ ^5 V( E  q
  • 3 O# g5 N6 k% v& |* Z- |
  • 8 a4 ^8 ]! z0 L- ~! O$ Y7 d( u6 {' x

  • 7 h" q# @1 U, B# O

  •   K" T( P: Z. k1 {1 }

  • / J6 b" n6 f% s2 P! \4 C
  • 7 {& o9 Q- m0 V5 r) j

  • * n4 @0 k' X8 Q

  • ! G2 v; H0 g; }
  • % A7 V4 n1 K4 }6 V5 E
  • 0 H6 P: i" ^9 F$ |, W% c
  • 8 _( C- F% W- \$ F  K
  • 1 z( r2 C2 [4 x3 P

  • 5 H; w* R5 m7 `1 m1 x1 ?

  • - k/ f# D% Z  D! }: s7 S, _7 J
    & n9 N' v, e9 n, V

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()
/ g+ z& V+ T4 K" z8 N3 W5 x

1da850d5cdd66b7f685d1f819c9f7321.png

0 m& N! G- V. ?$ x5 O0 A$ q$ V: F


9 a5 l6 g! g. m) }2 U/ c0 {3 z                               
登录/注册后可看大图


8 x9 z, A3 L1 f: m

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

回复

举报 使用道具

相关帖子

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