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

[复制链接]

温馨提示

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

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

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

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

$ J: J4 }- k. E1 H0 @

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


( n- b5 K; M# e: z

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 5 M- L& V$ H: D8 n
    4 w3 n5 J7 ?( a, A$ u' l

conda install Cartopy
0 v% S; h! F) J

: x' a" O. Z. |1 G/ S

! |2 a+ u7 f& M+ A: R# d+ E. m0 a/ g! p# ?

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

例1:


  • % Q5 @0 R- j  w8 l

  • ! r" Z. Y: S, ^% `. b: O) v9 F9 U
  • 7 W4 ^3 ~9 u# ^0 M4 W+ P

  • 0 ]3 {; l/ A2 ^

  • $ h& {$ O' w( f3 O+ ?( V

  • + ~* E  P2 \: t; n1 M8 ?' v) ^- v+ ^

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
$ r# Z7 H* O+ w

2856b94b0ff5bf4357137987d7c167b3.png



  • ( s$ Y7 t) G( ~
  • $ D. T( C4 Y& m

  • , J% D' e3 ~4 F& n: @
  • $ n: D; b+ f/ {% k! T

  • ' M4 |6 o9 H1 o* k
  • # i( j* M7 W7 n7 L# H6 M
    ' u6 X0 ^( f# s1 h, N" [, ]2 J4 S

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()& K9 X# G! [+ F* l

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • ' n# k5 f. Z6 C" t) o. U) @* [

  • & _, A; D7 B! \9 U5 D  @; `

  • & ~! {- E! D$ D& u
    6 U5 R7 K# y: C+ k* a% Y$ a: D# M

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
) |5 t( i/ C5 i7 E5 k% H) h9 l

& x) c0 o( E5 d# j% j& Y/ ~( X

绘制时间序列图

例:以三角函数为例绘图


  • , u! l. [% Z3 L

  • 2 @  |, J7 n" i- l5 w: v

  • ' X5 |3 T. [% x
  • 5 d) B6 \5 _' e; O/ Q

  • % {6 w- `$ u- V% K4 |

  • ; v9 C' Q0 B4 [! u( |
  • " b6 U+ n4 s; q% {
  • % J- x8 k: O& A+ M4 T4 h

  • 5 d' e7 ~6 u* I& @& i2 H: a
  • 6 Z0 Y- i6 F7 r1 r! W

  • , {5 _0 Q- F$ q# {; W, e

  • ) a% V) [* S; K/ i' s
  • 6 I0 y1 \0 p: e
  • ( _% {! H" z- x
  • 6 j  N; Q4 R& E9 t& H; v
  • 3 ~/ T, y4 Q$ |  G3 t. N
  • 1 g( m2 _$ c3 L& B

  •   _1 l! d3 |" L) R9 x% ^

  • # }$ A3 v5 R: ?& V1 ]1 Y: u

  • & [$ n/ I) Z/ E" f- ]7 n' V' o! }+ b! I6 H/ a! `% E

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()
1 `. l0 _+ ~; s

7d0cd3e557628cb00d61b8a5a167f62f.png


; Z% ^* t, ^$ i: s- Q

2 ?  M2 ^* Y5 @
                               
登录/注册后可看大图


8 v# {& ~: t* }0 D$ ~9 x

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • 7 ?* X; _5 F; B; I! u  t6 X9 b  @

  • ' y( O/ e3 r! z2 Y* d4 ]/ ^# `
  • 6 R2 T8 ^5 [0 [% o
  • / N# [' H( S( P  @5 x) O

  • . c) c  C2 M5 ~/ `
  • ; E+ }8 }- a- \. ?1 a) j' g

  • 9 R. F0 F8 n. Y8 m/ B, p
  • - I$ e8 g1 c! a( M
  • + k: e9 K! M: k: w6 u. `( [" Q0 l

  • $ t" \) I5 C% x: n4 d) ~8 N. H

  • , [( u3 L6 H4 r# h
  • * j; l# S: p/ ]6 w/ e* F7 u

  • 0 q" f( y  m, ^" B4 R2 v  x7 X

  • . W" X2 T, Q9 _( e6 T

  • 6 b, {9 L9 Y- e1 {0 U4 r! T
  • , d2 D" B* L3 C4 Y

  • & j8 |4 ]8 ^" }: ^% @, x

  • $ I8 l( B; ]% |) M

  • # o. [  }1 l: L1 _; g. j
  • 6 S% ~. Y( t5 o7 [# m

  • 8 I- g: Q  q0 Q
  • : p- s( B3 b+ K- S  K) g

  • 7 Y% }( g/ P% g- _, Y
    + ~) G( ?3 C* K& ?. \2 p/ m+ ^

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()
! D( b' P* `" }. u0 \9 m

1da850d5cdd66b7f685d1f819c9f7321.png


7 g- u5 H! Y8 j9 m' l3 G

9 M% B, P6 _/ z8 M8 J
                               
登录/注册后可看大图

) p$ ?7 K0 |3 F3 j- ]

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

回复

举报 使用道具

相关帖子

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