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

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

[复制链接]

温馨提示

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

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

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

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


. e& H+ {) v0 d3 M

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

) o# {7 r$ v- m# c

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • 1 ]" w( E' u3 X  Z+ V' M* P: _, j+ l
    4 q- Q' q* H9 L; z

conda install Cartopy
: X: n7 {. `' ?/ x, m


' s  v: N$ H# h3 Z8 i7 e5 a, a- Z% N- |/ H

/ |: R  O- |: j* t2 G' I

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

例1:


  • ( ^2 [! n) ]  z' [

  • : t9 z' {! ?3 M5 Y: r; u
  •   T/ G) @0 |  P  ]

  • & a, Q  Y9 f( L+ C0 [

  • - k3 V4 S2 a: c/ U

  • % K) q; H; y5 K$ \. b: {4 q
    , H0 _6 D+ e& Q" _

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()8 q) p( r" Z  K# U

2856b94b0ff5bf4357137987d7c167b3.png



  • ) i3 y. m# [! w5 B

  • ! t# X9 q$ d, r. ~

  • - U* E4 O. m/ y" N) s- E! n+ Y% @, V2 ^
  • 8 a0 k. {7 F, F; A- f: C
  • 7 C" k6 a1 v0 ^  U

  • 6 S. R6 R/ T5 H. D4 ^" x
    3 y/ v) T# I4 D0 ~' m

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()+ g, k* E! f. d- R$ D

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • ' O; E6 `/ x. e- m
  • 3 c2 q3 t( B5 ^. I( @: W
  • 9 f$ Z0 f  Y- A3 _, |, z

    $ |, i1 W2 d" e$ t4 A

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
" }/ n4 U$ U9 T) p

: x+ b. Y4 ~8 r% E6 N! f3 H4 H

绘制时间序列图

例:以三角函数为例绘图


  • 9 H  f9 Y0 `! P% ~7 s
  • ' h0 E3 L% v5 Y3 ~1 Q- m

  • " {' I+ {; Y" f6 \
  • ' G, G' \0 U- P- u" f+ p3 T
  • & D4 w, I* R% p6 {/ ~

  • ; _( e& |# Z; U9 |
  •   N6 v" O1 Z% M# _) R) I+ @
  • ) M9 f/ S2 I$ k6 X/ i7 h+ ~% |
  • . f9 `- g5 r- P% k: J2 L

  • 8 t8 l4 ]# ^) z8 U; j

  • 2 E/ O. M4 R* t' x: b

  • 3 q1 U4 P( Q* O. E

  • 9 n( m  W3 i% I, a
  • 6 `1 W/ U4 n9 i) A  o/ X
  • % p4 Q. A1 F, I& k+ _# g
  • 9 f0 a1 j$ G" d* v
  • 0 l; e' Z) F# D* k6 o9 j6 h. L
  • 6 _5 h+ H! a! `/ O1 j
  • 6 S$ [) h* e; m' z
  • : Y! J& A/ J: t! S# j6 C

    ; c9 Q, P2 K; A: L; a8 d0 U8 p

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()
! y6 m- t. U5 B' g

7d0cd3e557628cb00d61b8a5a167f62f.png


! K- @5 C% m' P" j


9 s& y& a& u% T. W. d                               
登录/注册后可看大图


, r. S% ]# q: s6 X: d* w( w' J

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • . D' U5 l$ H5 L! ]; M0 F
  • 0 U0 X1 b* `# X) ?3 u, O
  • - Q  D# D6 p, h6 _* U
  • 1 j8 ]4 t, x, K( t

  • ( A! T( [5 T" M: T& Y7 Q/ R

  • - X6 l9 B/ |; N) [5 D4 P9 X' l

  •   s( Z* O, y" n6 [3 a' X- }

  • 1 ?& x: A2 m0 l" g* v, z' O, E
  • ' I% L" G0 x, W. [! D/ F- k

  • ' V" \" _7 j! u# H) B/ t# K
  • 3 O; L3 s& P" G* ?1 ]) o

  • 4 m' f* A' @2 P* p1 o! G* k

  • 6 _8 }  y4 Q) G0 P2 R

  • 3 Z) }5 |2 R8 g1 d: s4 a; b, ~2 L) L
  • ) G2 l& k, }" N# ]" l2 W( q9 V( W' j9 w
  • ! N" w6 S, c/ ~& Z- T5 R% w
  • 3 c5 D7 e1 o" ]  b1 _% T
  • 5 Q; x4 E* \& k
  • : h& O  A, F! i9 f: T

  • 1 ~9 ]. \; b0 l

  •   x/ i1 x, F7 \: j8 q: b$ D

  • 6 M" u7 l  h: k. U/ l
  • + _( u. @+ H; D  G+ ]5 z

    / f& N: W; H, w

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()# I8 B: y! v& g' V; O

1da850d5cdd66b7f685d1f819c9f7321.png


9 X1 [* V, F" r/ f- V

/ |$ I5 b# |: r4 M' o7 ?
                               
登录/注册后可看大图

5 e4 z1 g+ H& f7 k( b

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

回复

举报 使用道具

相关帖子

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