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

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

[复制链接]

温馨提示

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

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

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

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


6 S" v) C- a* U  ]/ J/ s* r3 y

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

% p3 k, e/ N" s' T- _3 r

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 6 z! ^) U8 l& B/ W; E3 W6 Z* h6 n$ K9 A+ c

conda install Cartopy
) j3 N4 n6 S# P, C* r: C


7 r( m- ^" E( v" |1 w# N
% n( k6 v; @3 R! K6 d) @9 [8 B. i* _. n/ |2 ?! X. G

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

例1:


  • ( `' `( x# C1 Y2 u) G2 x8 Q& v
  • + J$ s# b8 ]  l& Q2 R' l+ f7 S
  • . V2 ?, v% t# r2 R5 U
  • 9 a" q, E& W, k! t; z) `
  • 5 M( B/ m/ U5 |7 n" H

  • ( A! ^* p( m# n: \
    / O; w1 H  T3 Y

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()$ M5 K2 S( `# x) z$ b

2856b94b0ff5bf4357137987d7c167b3.png


  • $ {; [8 V$ J( H6 y+ I
  • 0 k" h* ]6 p3 Q, ?4 v9 f% K
  • 1 e  x2 v/ l' A1 H0 s* t4 N4 }

  • 5 |5 K& `( C- k

  • . U" n  _# @% n3 I0 d
  •   F; [% q0 }& h9 p8 d

    6 Q  P- R8 @! o; N# u

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
0 p2 q( n& Z, H: Z4 u; a' F! c* i9 N! m

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • - [4 y3 B& u$ N' T
  • - S3 ^" a0 m. u! f4 u" ~/ S

  • 9 E  [0 v8 C4 Y! l. d$ u0 x0 w" x/ q8 b; v) a  X2 S

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
' c# T% u% K2 f6 X- U

: _! a7 Z/ ]3 r

绘制时间序列图

例:以三角函数为例绘图


  • 4 V+ \2 j9 p; l$ Q% s1 E$ T
  • 1 ?/ r, v6 y7 R# i* X4 N

  • 3 n  N. K3 p' A8 q* K2 T( j
  • ; O/ _$ S+ L% u# [# e
  • 9 ]6 [, |4 m% X/ Y
  • * l9 l  [; l( M- s

  • 4 u7 b6 [* l# F7 e

  • + f# k& @5 S: d% x

  • $ P1 `0 o9 L6 J8 O0 v
  • 4 g* I  c% t0 d( ?% h5 I' r3 M
  • $ T; U9 i2 U+ v/ |5 r
  • 8 @/ L8 I2 p& y2 b& |) C

  • ( z. [! R" I# T- a' Y3 J% |
  • , Q% i5 z# ^* k0 m+ _* Q3 s
  • ' Z# T& O0 g: n$ i

  • / Q1 D& R% n5 v

  • 3 z- m2 _4 u: k3 ]' w
  • 1 X+ {7 @1 o# I

  • 4 D9 C1 _; r2 m# D( F8 |) _

  • 0 a4 g) H$ U/ }  J3 d& @  |4 D1 }* o4 s$ J

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()
* j8 t& E7 T8 \0 l7 W& z! t

7d0cd3e557628cb00d61b8a5a167f62f.png


) Q( r6 \: }$ S) d9 s! n/ y


" `& K& [9 m& k' [1 a                               
登录/注册后可看大图


9 ]" E  h% L2 K7 Y0 [

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • ; ]/ I9 Q1 ?4 u8 k

  • . w( @  F0 }7 `$ b5 ]: `) x  m& S0 O

  • 9 J' {  k, q" @

  • # O. S) f5 [: N4 t) j
  • 5 q5 Q4 A/ s9 a2 o+ p$ V  r

  • 2 Q: H7 T; w) n/ v) X( n

  • 1 p7 ~7 o, r; V0 z% |& D2 K

  • ' K, G' }! D" G8 N
  • 3 |. ~- y/ H0 i' }  o! W
  • . V0 @& ^9 C( \# x! d; h7 P# x. }
  • ' V8 Y* ?, V: M! t! q3 v
  • 6 t4 B6 N. o; |! \2 x
  • 4 g8 R9 S4 F; y) A# ~5 ~

  • ( ~0 i; q* H/ g% b/ F
  • . F6 U' U& h2 O$ c/ M
  • 0 h" E# O: a. E) \" N/ M( G

  • 9 f9 T8 x, z. Y! }, t! [9 F' W
  • 1 t: [$ n8 ^3 U( U  ?' I5 P
  • # ^+ S( E2 ^5 [# b' e
  • $ L2 @8 q, E  M# M9 l
  • 6 A# [5 I5 J9 A! e: E: U
  • $ z6 ^5 A; I& M3 ]1 P8 q
  • 2 r7 j( r0 m! u* _; S( u
    3 U! ]5 o2 r0 |/ F. s6 i

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()& F) g! z# i) e# @

1da850d5cdd66b7f685d1f819c9f7321.png


. k" `* I; P2 X- G0 E


, L3 s% @& l1 O, s                               
登录/注册后可看大图


- n2 m" h3 ~  T$ f

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

回复

举报 使用道具

相关帖子

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