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

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

[复制链接]

温馨提示

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

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

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

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

. a. A. z: q1 ?) v' F/ }8 j# Y

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


* i# H+ ]/ x0 f

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 9 K6 e+ J, U6 y2 G) d6 H0 e. l0 W2 |$ I+ a

conda install Cartopy
8 ~4 H6 N: G* t6 N

( \8 }- C- j5 {8 b# C/ Z( S# X$ l' L

8 Z' J6 t0 B7 k+ E$ ^, C
& @# D4 s* V$ q

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

例1:

  • * g3 q2 b9 m0 T

  • / Q. Z$ u6 a" f, g$ ^) x6 I# i

  • 6 y6 Q; e* Z: O: c3 z

  • 2 A7 O: q6 i# X" Y: e' p
  • 2 ?7 M1 T6 ?( s4 i2 ^* S

  • + x7 ?0 ~! W& N3 I6 D# O5 P/ v& U0 m# V; f

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()  I! l$ W! z2 H+ ~2 q. B# i

2856b94b0ff5bf4357137987d7c167b3.png


  • 1 ~5 p) p; f7 W9 ]9 e; K* x

  • / C. y1 N% d, H! T/ w, f- U

  • 6 D  m; ?& V) M2 y. [

  • 0 z  M# c5 q/ o
  • % L% d( _+ j* p  j0 ?/ p

  • 9 p5 A, R" Y' n# ~, v& t* O. a5 Q
    - V' A7 ~6 ~. {: G( N

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
: U  p9 q! ~: Z  L( J

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • . U- L& d5 t1 x
  • % N# G- j8 }$ m9 \& M( X9 s6 F

  • * _! Z% t! ]$ j4 P6 Z4 S8 i8 Q& ^3 u5 O8 [- H6 R$ F+ q

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片, U# M  P5 E: ]4 H% M0 \# q& u

% b& s& s, U. j; a# I

绘制时间序列图

例:以三角函数为例绘图


  • , F  J5 U* a& F- W& X; f% i
  • * \+ s- u1 L# j; q% W* T4 q- W

  • 8 C) @8 \: ~  f  ?0 t

  • ( T4 l2 x+ _& p1 u* e

  • # L2 z- E: c8 n5 y" q, n
  • : J. y& j5 B+ `1 ?3 g5 S6 I
  • ! X" q- X" |/ W4 q* r
  • $ G. v& X9 R' |/ `

  • $ J! e% u) \8 }& v5 h0 z4 R; L$ w) b
  • 8 O1 V5 ~, L3 D0 `7 \9 X8 y

  • ' G* V) k: `' n9 x' \, n" l5 w1 k3 q
  • * T% V* {$ A4 U
  • ) Q1 Z, d+ D) U( h, [4 k; [) }7 N
  • % e; s3 m0 h$ a) n( {
  • 8 l8 M3 `& h" l" s0 I: v! n
  • : _. E8 \# ]5 w$ M: F  m. K1 t

  • ; Y& ~2 p4 E- D7 H1 a" [

  • 4 W4 s* o0 v0 I+ ]: E9 V
  • ' d5 N- g9 N! ~( r8 B/ X& R
  • 5 @5 d% O0 q! \# e4 H1 I
    0 x/ a5 X2 `5 [4 k/ d# s( i+ V0 ^' ]

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()
0 @. i; b: S1 \; @2 ?

7d0cd3e557628cb00d61b8a5a167f62f.png

7 h" A/ L+ K( A) y5 m8 t# t


' E" Z7 `% v6 L7 |4 [, d% f5 e* w                               
登录/注册后可看大图


% o; a& ]6 H4 S+ x+ v2 K

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • . [% G) ~+ C1 s0 {/ o& E6 ]3 C
  • ' ]+ Q% n/ x- V6 C% t- j
  • $ ?+ @* t" ~; p+ S4 b6 K+ y

  • 4 ^' }3 a; }+ F( C; l( Y
  • 9 c. Q7 \! l9 }, s' b0 d  o

  • 1 ^) G; r  Y2 ]; T

  • 8 w& D" w' O1 W9 f: b+ j
  • * q5 |# X5 X5 I; R7 A
  • + |) s8 c6 A7 j+ w- `
  • 0 F% |) c* I$ E2 Y. f
  • 0 d% p# f! G3 Z8 c7 S, B5 x

  • , T! c6 ^& `; u) @

  • * u$ B2 Q) s2 T5 h0 e

  • 3 S* V1 T% U) p  w

  • 1 y! w& Q: F$ e5 d8 q

  • ! \9 ?( K! _2 o: e% Q; ]+ o
  • 3 c! a% F4 V6 Y( g8 D
  • 2 x& i2 ^0 p. Z" A4 A- s

  • 4 B& I0 }& [- }( [$ `
  • $ ?$ G$ Z4 B$ n/ o; J

  • # Y5 v8 W5 E% Y5 ^0 Q% l4 j
  • 4 D/ R+ m, v% l
  • $ C0 N7 K6 u  C8 x' ]2 R! e

    # S: p0 ]9 ]* Q% b: \6 @

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()
% T: [: g5 N2 l

1da850d5cdd66b7f685d1f819c9f7321.png


7 G  e% |0 P8 L5 l' v4 L/ B

* s, B" C) S( e4 t0 o
                               
登录/注册后可看大图


0 O0 L0 Z' J# S

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

回复

举报 使用道具

相关帖子

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