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

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

[复制链接]

温馨提示

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

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

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

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

. p( M8 D% B$ K- E, V- ?/ X$ g8 [5 f$ J( M

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

6 }  E/ B9 f1 x8 Q8 C7 g

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • ; H* ]0 x  D7 n% i7 \6 u2 J
    + F* }% f2 z5 c/ p7 S

conda install Cartopy1 B& ?# c' ]- j4 p8 x


/ W+ P6 K( a! W* U! {5 ?6 X1 r& K: j7 ^$ `. E* T5 f
4 [2 J9 J; w1 i- Q( Q$ I

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

例1:


  • $ s* ]- P+ h+ q8 C5 |
  • % f6 o* p* _, F" q: t4 m

  • ! v. Q+ Z2 D9 V% p" M1 m

  • ' B5 L9 m: G7 @- ?3 H9 O% G! }

  • $ N; P5 ~, F. t9 r. w
  • . P0 I0 h, j; T
    & K" ]5 m  I/ t+ a" y

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()( Z4 L. f" t5 h/ m; t% d

2856b94b0ff5bf4357137987d7c167b3.png



  • ) N0 u$ c8 S% v4 m' V3 j# y) y

  • 4 l! v) H  q& M6 P) B' K

  • % ^" P" ?4 {5 p9 L
  • 6 x' }# n+ {% _  r, z
  • + M' |6 ?7 a% r9 Q- U
  • 8 u4 y5 |3 ~$ b( V8 {" n
    ) {4 p! ^7 t. z/ p7 H! u

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()% f, H3 |1 j1 |) V

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • * @3 ]! f: r9 y1 N: R
  • 9 M" K( O) d) U7 M4 }
  • 6 Z( r% X! y& p. @+ R* q

    , w: }4 E  B3 g' P/ _" U# i# E" H0 X

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
' C* \( h( z* B  C: D9 X9 v7 `. J


9 L0 |: k: d# w' z) H" o

绘制时间序列图

例:以三角函数为例绘图

  • 7 ?5 n2 |/ ]7 W; F* ?

  • / P9 A9 r. w6 C: t
  • $ o0 {9 j5 _" s' ?1 _, D

  • 8 u# d' {, V; Q- P$ e

  • : m' y& ?6 a) O3 Y; t/ ^2 t( }: F  `

  • * ]$ `- x& _0 P# L! a7 Q% V3 \

  • % _8 F# e' u- C% Y8 c. H

  • " f3 Y: [$ `) k
  • ' n; [5 G0 m6 H0 j

  •   b1 S- U, b0 a+ t
  • 8 E: d# ?: m/ j( D1 n# v% Z

  • . A" @$ ?  T1 X2 g! z

  • ' `) L* n0 Y# D( ?1 ~

  • 4 B' n# {9 c( @

  • * Z8 J' j8 z. K% s' _
  • - v; T& v& K. g% [4 d7 N" Z
  • ) o& Y2 v; G: q+ P/ w5 x0 P: Z* Z
  • % m/ F3 Q3 U( p# x% u

  • / i: l, P+ S/ E3 m  R6 |

  • 5 K# N& {2 \" R2 m( g' P- V; A6 ^/ I- C+ U

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()
- i# Y: {( w% E" B( a# O4 |

7d0cd3e557628cb00d61b8a5a167f62f.png

/ a9 Z! C# W  D8 u. D


, Z9 l7 a) q# q& h" z9 [0 M  |                               
登录/注册后可看大图

* I3 j. M; O* H( r

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • 0 g) a9 S$ n, i% m% w# |

  • " k6 W; X. o9 `* i; c+ {9 @& q
  • ) h6 N% ~7 p! p0 L: m2 R) h8 E

  • & e+ b& J# f& L' h2 E
  • 8 D# t5 L3 Z' u5 A7 Q* j
  • % J6 i/ r$ m* w2 r! ]; p

  • ) {( W. d* E: @# P
  • + g1 w4 y7 o& E  e* ^
  • % L# t; z1 h; n

  • : e  R# k( d4 ~6 `) o- M
  • , H, A$ L) K) R, S8 Y8 K
  • : S9 h1 A) u# H) `) f% l0 ^

  •   P/ {2 m7 Q8 N
  • ) y8 E: @6 U# e% D

  • 4 p) A+ ]- \$ V4 S) ^& C1 c
  • : H5 F0 Y( w: Q+ Q# g$ f/ b8 E& ]

  • 5 Z# ]' X! \3 S
  • & s+ M* L; o+ n  t

  • 8 t. r) S* S1 X% d) e% b
  • - p5 c% J; o" R& G  G. z* @

  • 7 ]- n+ y+ K& i! z: U$ `0 G
  • # y+ U1 y3 P2 J+ L7 R# P

  • / M2 j6 S( o; M8 z8 r4 H
    - c2 t; d2 c0 i0 w% 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(), |/ p. T. ^0 _! c: Z3 v

1da850d5cdd66b7f685d1f819c9f7321.png

. F6 u. I5 I* z* A* a

  [5 O' g# p( b2 X
                               
登录/注册后可看大图


% D+ ]' P3 Q* J" Y# Y

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

回复

举报 使用道具

相关帖子

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