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

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

[复制链接]

温馨提示

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

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

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

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


1 {: s: m! \# v; f! q% a

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

" H  I7 h  ?- X1 h+ @

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • ) R  t( t. r- i5 c1 O4 m) |/ v# G
    & t+ ^' C6 s; f- _

conda install Cartopy/ b/ Z8 \: G* L( t


6 Y+ ], N- V" ~2 z
' T8 T5 @( \+ _/ l+ a- R* F2 j3 @3 ^4 o

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

例1:

  • ; I8 N* {3 k( [
  • 0 B" e7 `8 D! |/ Y" y$ V
  • , B/ N* @3 S: O; _, p

  • + a. h/ A! T' P& M
  • 0 `/ {) I+ F2 i" J- C
  • * G; C6 Y. q3 {$ L( ?5 J. z

    5 V: R: A. L, J- H

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
- p2 {( _. P( n$ X2 E

2856b94b0ff5bf4357137987d7c167b3.png



  • % m6 G1 Y8 J5 Z# F+ ~( B
  • ( n) w+ _8 k" x; F8 ], N! i

  • 0 @( [, L" L4 L  B3 L: h2 z7 m

  • 0 F2 ?0 J7 k4 K

  • , V9 \8 I8 H7 h( i, `, g- I! V
  • 5 Q  U5 E* N6 O! O: F
    4 k/ K' L( Z" `% C7 i/ X* C2 Q

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()7 G5 y0 ~6 i0 p: D- v1 y* F6 j

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • $ E, c* k9 H* [6 j* {2 f: b
  • % E. H& e/ F! P7 [. p$ J3 e
  • $ x0 |0 A  z# v2 ~; n# w

    " _) N7 W8 X% X! s

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片/ Z9 V' Y& \2 w# Q


* i- D/ p1 F  u

绘制时间序列图

例:以三角函数为例绘图

  • 7 I) C8 K! R- y, g* @: i: u6 p
  • ) t$ X2 ^0 d% P0 m$ m. {

  • , S! `# \% s7 e2 B5 R. P3 F5 `# @
  • 6 z; ^9 }6 s1 t# }- k, w8 ?% Z

  • % H4 E% r7 {$ {8 L! [2 [9 u; v

  • . ~% z4 Z- h* w* W- ~

  • % w* F/ M$ x: {  ^

  • ! [' E. z; C( f3 A
  •   E. c* W3 g  s/ J# z

  • . V5 D& w$ K8 V8 f8 i0 c

  • 6 n; b' S1 i0 c! w; G) s- f
  • 8 Z' w1 W, z. A% g7 z( S0 I6 l) n) p

  • % ~' l5 J; Z/ i3 m6 ^

  • , u0 d  J/ N. D0 P" x) S% n/ |8 r/ i! m& ]

  • ) C/ {* O1 p+ k$ n: c" ^9 x

  • : ^" W& M, ]5 B% f8 a; |+ k0 p  x7 [. N

  • 6 i9 p3 w' o8 y1 N: I" ?
  • 4 Q- c, N0 L  f- S8 Q9 V* H
  • ) X  x; y% t9 {7 B( N5 h

  • % E- I- t/ t- v" A& ?7 O5 I5 B) r$ z9 e( Y$ l

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()4 z; J( u7 q% _

7d0cd3e557628cb00d61b8a5a167f62f.png

, d3 a5 s- U- V


# m3 p7 {. h5 ]5 H6 [7 b) S                               
登录/注册后可看大图


8 k1 H, c4 j0 [/ i$ i

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • 7 `& e2 H8 H( _  O

  • $ \+ u5 w& \# g0 s. X' n
  • ( I1 k6 ?! v, f) ?
  • ) U5 z& {, d7 w, s( C& K8 z9 d& o
  • ' l; [8 ~6 l& |7 v
  • $ O& E9 z, [+ m6 b! V) z

  • " t$ S+ K. n$ f9 D! X

  • 8 @) W8 N! g+ v2 v# _+ h

  • ; k; c3 d& r* z0 T" p, |/ e* I
  • . ^0 }8 `: V$ ?

  •   s- B8 s0 K' q+ }* B0 D
  • 9 c" P, Z) |, T

  • $ i1 L' G$ P$ H5 g! P+ v- E: K

  • 2 |# h: f, [6 N$ S& B
  • - i- f0 j1 R' q9 C) N# [
  • 2 y, P7 U7 w3 `1 E

  • 4 u& [- T8 L3 e+ z# j: m& X' U
  • + l8 X3 ]* r0 t- z* f6 ~
  • 6 h% v; C9 k( y; t/ _) r

  • 3 _" f; B8 C+ O, w7 O8 G
  • 3 v; o* @, {; S9 M2 Y. _: U
  • , b7 }6 z6 w) s9 r% _
  • 1 X( g& h8 u. Q' _. f

    " F7 i, N+ h8 w4 n7 v7 C( L

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(). m! E. f7 S! K" E! {9 }

1da850d5cdd66b7f685d1f819c9f7321.png

2 q" B4 T- e, N4 F


5 N% @4 R3 H4 U  n                               
登录/注册后可看大图


, N& h& p9 G% H, i

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

回复

举报 使用道具

相关帖子

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