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

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

[复制链接]

温馨提示

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

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

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

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

$ M7 a5 E- D3 D4 ~3 D8 ~/ v

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


- {. z: i4 M; o3 q* }: T# A1 E

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • 9 ?0 k3 o0 W( e2 k

    ; v# j) |, X: D( f* |: s! U

conda install Cartopy& i/ l- \$ x$ w- G2 F5 F) x

6 H2 c2 ?7 _) s. F( e
. g% c2 K3 b8 [1 s- V2 k3 q
  q3 y5 r3 e7 R& E9 o- h

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

例1:

  • " w5 q. p( K$ p* g* F0 \

  • 0 K5 \: e' K4 w5 d
  • , @$ ^( g5 t8 L' S4 l
  • $ m1 ?% W! v7 E% o- L% }7 \

  • 0 z( j0 c( w5 I
  • * }1 a5 j6 A5 R9 \

    # |6 T* Z( F* G7 O. r, u

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
# f6 ?# s. c, O9 ]: U

2856b94b0ff5bf4357137987d7c167b3.png



  • 5 E1 Q3 f# r$ y$ ^
  • ) L; C- F& a5 d
  • ) l8 |  l6 i1 V
  • ! w) C6 C! p7 j% I- S7 ]/ f

  • ' l) \: B* k6 D6 i; i' n

  • 3 O6 Z2 W6 C8 Y  j( j
    $ h% A* y) R& Y  |/ ]0 w

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
2 y& e' M. k7 g/ i/ f" ~* r

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • ' X7 d$ G+ m3 V* ^

  • / g: X- b) F/ ]- w

  • % n' l4 `. B" @4 S
      Q7 g& K# ]* `/ J* u3 o) P: G0 y

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片; n- F% c, D; H6 B3 A( i; i

2 o! P4 @( m7 g$ J. M: O

绘制时间序列图

例:以三角函数为例绘图

  • ) \7 m1 M3 m" r6 m5 _% V! O

  • + ~$ a: b+ L2 z3 t% Q& |
  • ' T( q: F8 H9 I% J" `7 k4 p$ A  F" F

  • . Y5 Z1 ^; _+ @8 d" r- |
  • + X7 E7 V" X1 a: o, i+ e" V
  •   b6 k0 v& e7 V

  • ) \7 w; D! v( _9 E% k! c

  • 9 M8 ^) E+ D' J9 j) ~# R7 Q3 r
  • 8 a6 {8 y/ ~6 N: @# D$ {* b5 Z/ ~
  • . D" W6 }  ]* U

  • # L1 N# y( a: u4 b% a' k, S

  • , }# f. v' }' [

  • . ^& _: T4 E- |

  • 9 p& m3 y" p, N7 x$ K1 O2 t
  • 8 H# _! E- h( o4 V! h

  • * z# c2 q8 E. }7 Z2 U) P
  •   L! O1 o7 }* ^+ o" _, b

  • - @; M' S7 o- u8 m8 [- t
  • ) K5 Y( O. |, K$ {3 x# J& F

  • . b; v; O, u6 m7 f" w" ~6 r9 E8 ?1 ?9 M% P2 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()& H5 \/ T6 R5 E$ N( w

7d0cd3e557628cb00d61b8a5a167f62f.png

5 m0 a* V4 `2 r. J% h% v8 W! Q


% r, ~" E8 s: W3 a$ N                               
登录/注册后可看大图

# i$ R. F' x0 x8 b. S  V

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • . n' e* F5 L3 ?/ \6 f- y9 q1 @; C; [

  • / Q- M1 ]6 D# R& ]
  • # Y; k5 M5 x8 H+ X/ T4 S

  • $ v) }" ^7 M) I9 k7 i4 V
  • / |$ D. e) {; J8 V3 O9 m7 A& E  y+ A

  • 4 |' k* p& V4 M+ y
  • ! S2 _) I" L2 r) s
  • . O! w- s( I+ @! X7 d2 @! Q

  • 0 N  b6 s+ k' s1 U# q: C
  • 2 H& F1 }, s( J

  • " a# ~/ g# B9 L2 V. a

  • ' F: a/ n3 \( \

  • 9 g! X3 z. j- v6 x. i" z# B

  • - N5 w# S. [0 C
  • 3 y& n- r* e/ |- b9 B& _5 y
  •   `& h# I9 N( Z# {* J' ]
  • 2 H+ x7 Z- K1 }& R* Q& M
  • ! L4 R' G5 M. D0 C
  • ! ^" A# Y0 N# s, Q* k2 z
  •   j* p! _2 g% s4 t) N
  • & S# v! L% B0 V) B. \, V  M
  • # a- w+ M6 g& T% k. g& p7 J: `

  • 7 B: j( \) c, y- z$ P( n! q$ v! p8 A3 ~+ }7 x% 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()
& T+ }3 L5 x% G0 R

1da850d5cdd66b7f685d1f819c9f7321.png


, p+ b6 u7 S. ]  |


! H! y( j3 Q# m, k7 K                               
登录/注册后可看大图


3 T- \3 A! p* s; j3 b; o; d6 l" A. p8 w

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

回复

举报 使用道具

相关帖子

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