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

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

[复制链接]

温馨提示

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

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

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

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


, m, o4 X! o' r) Y1 z2 c/ }8 L

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

5 G6 C: V. Z4 L3 u0 O

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • - }5 `! A8 l+ L) L. z5 g& ^
    % A9 p" f. R' h1 x1 M

conda install Cartopy! ^: V* N+ M; q8 K9 m

9 x+ k7 @0 `* [2 q; Z
4 {2 E9 k( a' k9 ?" M: z& g
8 \" {8 ?) s9 s: N0 P3 S7 F

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

例1:


  • " t/ e/ Q7 e: E

  • ; n; H# d6 M+ O$ s9 x

  • ( O2 E) Y3 ^  k% _2 d
  • 3 j( |* k; F, B7 a

  • * B8 Y8 {3 ?; e$ a2 o! C7 t

  • ' o' `( }1 ~" R$ H8 P- H
    - T1 _- z) T) t& V( l/ T

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
& j( x9 B& W: F$ _% f

2856b94b0ff5bf4357137987d7c167b3.png


  • ( v+ m2 r! W( X" x2 w

  • 9 ?4 K$ W" L) I5 |2 o

  • $ k% r/ @. u' G5 M
  • 3 J* p' V2 K; A+ i, [; A7 p8 j# {: P

  • + }' N9 u& Q+ n
  • ) ]0 I7 t- O4 D1 M7 a7 I; i# C4 y
    : j; O' _1 A7 ]  g# u) `

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()8 v# ~: X5 W2 f. K  t

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • $ @  T/ j* b2 e; E2 w# e
  • 9 W3 p' r1 n  U' f; A6 P: [; J
  • " C( b8 J/ i2 Z
    ; ~; z2 E" ~& I/ C( d

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
2 h) q! j" n( T8 @$ X


9 r3 d5 ^, \3 u: @

绘制时间序列图

例:以三角函数为例绘图

  • ( |( v! h* D" m  ?8 E/ r
  • * C1 ], q3 n- c6 `  t5 b! V4 A

  • 3 ]+ u5 j0 W9 |: V/ T: f; w5 U
  • $ \0 E4 A% h2 a3 t; l1 N( k
  • # T4 i; X/ S6 @; n9 t* b6 ^$ }
  • ' o9 r: d( g9 Y9 ?, ]0 H4 X
  • & \9 {  _5 L" J: y
  • 7 l6 V. V. D; X
  • # m9 T) `  s: g# M' P( X: j, P
  • ( }; H+ @# P7 }5 |
  • ) m* [" j6 F1 Z! [* j6 p

  • * I' |8 k. z- p! e$ h" I

  • , F* D. b/ R1 a( f6 [7 `7 Y; D

  • & ~$ U) ]& H: P# X+ W

  • 2 S! O% z+ ^0 L1 V# f

  • ; v! U/ c5 U' p( O. y

  • 9 W: C6 w5 a" u( x$ q' [
  • * R2 p: g5 {/ I4 p8 x$ b# D2 k( `

  • 2 w5 T% w1 b4 e+ }

  • % r7 I( [1 s6 |7 d+ [' [  o! r- j( h3 V

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()
/ c; R7 r1 x  Y- i

7d0cd3e557628cb00d61b8a5a167f62f.png


1 ?4 [5 L" Q7 r/ s

1 n. F, x: T! S. M+ G
                               
登录/注册后可看大图


0 c- M8 B3 q, E

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • - p/ T) x& l0 _& t, f
  • 5 l+ R! Y8 D0 }& C9 d6 p, Z# q

  • 6 C# z  Y: S: `  y) r- t* p, ]
  • 6 e9 s+ s! F9 s$ i* S! v6 I: c# w
  • + g$ Q7 S: y, C

  • . w0 |  X+ g; }- Y. M
  • - |" X: f9 K' J8 C

  • 0 e0 I: P$ t3 b" O5 c+ s) R# i
  • 9 O, D5 E; c" w+ B
  • - e4 P+ L+ T: w2 R# i, m+ ?

  • / Z/ y5 ]( m0 n" N) `3 q
  • 8 u* {6 N% f! J& H1 i, f! [* `

  • 6 K4 R* R) g8 n7 g2 _4 D" `! t
  • 1 u9 d3 I$ e. v$ `7 Q- S

  • / q4 N. ]& w% m

  • : v: ~" `! @" ?' l/ }% d
  • 0 y! e" O2 b' Z9 u1 p0 {. Q3 e
  • 9 D% d" o* T" T7 {4 T) X

  • * k" o" ]% F$ T8 W8 L
  • ! T$ p* ~, |5 Q. {; l0 {

  • 0 F8 ~) M$ Z- I6 x. @; ^5 c2 v
  • 7 D2 A1 Q% N, J- _0 m
  • " D) ~& i" l0 S' l8 g

    3 n! }- X1 r% `0 |- V6 r1 x% {. 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()
& `! |- I0 }, H" i0 ~! b

1da850d5cdd66b7f685d1f819c9f7321.png

4 g: s5 C2 N; t& T7 O

* z9 ^4 m1 t$ S( c
                               
登录/注册后可看大图


1 j8 |# x% J& q% Y

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

回复

举报 使用道具

相关帖子

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