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

[复制链接]

温馨提示

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

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

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

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


3 V% n5 K9 T1 N0 Q5 s

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


7 ~( X3 e2 d% `8 i4 m/ c6 `

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • , k& z" x( m: {9 U8 g+ a' q' \2 g3 |$ s( U$ q( s5 S' @" u( `6 s

conda install Cartopy
- y' h! F3 v2 l


2 D! X; g# O% Q% y8 F3 p0 i3 N- R8 x/ i" L& t% F+ a
2 K+ p/ R  Y; J& ?! K) }7 V

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

例1:


  • 9 L# M2 u- t; k: C5 n" L0 [
  • 1 Q. k! Q& G8 }) m$ y9 B. N6 e
  • ; l, O  `/ _2 y; s2 V
  • & p2 Z( ?/ F% B# q3 R& [
  • 4 }: H( x! k: d9 n

  • ' D1 S% [+ n& N# Q9 Y4 q1 r. ]9 r2 b; C5 H- W2 l% P

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
5 `1 ]1 t1 n' p4 J1 @

2856b94b0ff5bf4357137987d7c167b3.png



  • . ]( E9 P( F. c3 m: ~5 Q$ X6 ~

  • / o9 Q3 A! W, o3 ]& R4 x
  • 2 C7 |$ H- z. X2 n3 ~4 s
  •   u- _9 }; x0 y* A) ?$ k  D+ R

  • * d9 m5 K% u/ _, H/ s! V
  •   u, `1 V, k2 E7 g9 S

    + ]* K4 b- K; ^8 h7 ^

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
% N. m  ]# A4 y, V

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • . a4 h7 K1 g+ F& V& W

  • 3 H# `6 h4 b& b+ J5 t- ^9 r7 u: s
  • / r6 x1 r1 g, p/ }

    5 p+ `8 p. O0 f9 l

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
' n( k% }" e! F5 Z; d


; V4 [+ S9 X+ n) j4 `

绘制时间序列图

例:以三角函数为例绘图

  • ) p& T3 g8 L6 s
  • & e2 I" U( M# W1 z
  • + G. V: h  a) K2 w) P! s8 T1 S  T2 f/ Q" ?

  • 0 z  a$ I! z5 ^! @2 z: a' V; w
  • # S  I( _. o0 l- h) n9 x

  • ' R* d) i3 E; |( U6 O

  • 6 d& x) D) Y) C
  • * k, I4 T7 [% U6 k5 ^

  • ! S2 x2 L' e' c7 I' ~8 o+ u2 z) `
  • 4 c7 j: J5 Z4 {+ s
  • ( ]* s0 n; U0 M! ~: `- S- E
  • + ^. i8 f! `/ @2 M; C, ~$ {
  • ) o! ?& \. X. t- s+ r9 ]

  • % s- Z" z9 ?3 b5 n- Z

  • % \5 e3 f5 h% i  }" K/ J$ d

  • & \/ b# z- O6 k6 ?: o. W& _- e  |4 r
  • # j& ~# v, D8 M+ E- b5 L& O
  • ' V/ C6 V/ `5 L" F
  • # l2 d- e1 x" k: q. A% _
  •   R- X; l5 f( Q+ w4 j* T

    2 k! r7 L+ y6 P/ @$ W- h( y& A! h$ 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()
7 E3 w6 ~5 ]5 A3 N6 E- g

7d0cd3e557628cb00d61b8a5a167f62f.png


  ?7 m% X0 v% P9 E9 W4 ]


5 ]& d  t- T* [8 D: j                               
登录/注册后可看大图


2 l8 J: O! n+ e2 j/ a

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • + z; _# S) G( i" y/ H- Y( Q; J+ w
  • # e/ [6 H# N% a' p6 }

  • 8 Q5 t* b8 P  b/ k

  • ! Z! i: C; M+ z) Z! W- N# m

  • 1 N+ a" }# w# D0 r( C& U
  • / \$ t4 f* @$ `4 R
  • 6 I/ k7 l0 u8 Z% N  o' ^
  • 9 j0 D5 z* N+ `
  • % ?& ~! \8 F' s$ c

  • : m& t  `2 J$ z9 I" c

  • % H1 @3 j6 f5 z: b7 d& ?

  • ) X0 C6 n+ i8 r5 \2 n
  • ! l$ F' W9 u! e0 K5 g: b- c$ m& D" R
  • + I/ s/ C) n2 S; C

  •   Z- w# f/ n5 x% m- x- R

  • 7 J% Q% @/ u4 n  G+ }, R
  • 8 @( w" D8 Y: k5 o

  • " M) D) @3 u1 V% a9 C- o. s
  • , b# k% }, Z: f4 o4 ]1 |. o

  • 3 o4 x6 X) ?# t* O1 }0 Y" j
  • ! c! H9 T9 y, k3 Q8 Q- C1 g

  • 0 q7 H6 N& p; A

  • ' K) D$ a* {( q4 j2 n
    9 }1 O! v2 X( q* U- E

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()* U3 O3 g( m7 e) X

1da850d5cdd66b7f685d1f819c9f7321.png


( Y8 Q& m3 e5 U8 h# ]' {( j


) H2 h/ P+ V: o7 [1 X7 B                               
登录/注册后可看大图


) c9 ?) }5 B8 L! e7 a% `

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

回复

举报 使用道具

相关帖子

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