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

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

[复制链接]

温馨提示

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

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

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

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

$ j+ ]. I2 X, j" V+ @  G' }% e8 s

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


8 A3 p+ |3 j' T* t9 N8 J

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • # k! b' `1 i& ~2 Y% o$ t
      o: \3 G% X1 B

conda install Cartopy
; R4 `9 Z5 b! N$ c' ^

, R! C0 z: K6 ~1 q5 r- \+ W4 u
7 _& L% u) f; @  C3 z/ ?
  P8 M- s9 J1 ?4 [4 s- e& L

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

例1:

  • 1 D$ z5 F( u) @) E8 A
  • * {: \( O+ ]: W8 m) k+ d
  • " ~  e: i: Q7 Y7 `/ Y9 ^2 |5 S
  • 6 P% r# `/ @. V2 v

  • # G% X1 l, H* Y/ C8 K  G
  • # Z2 q3 y- v& K- N* g8 w

    . t! d  W  ~# N$ m

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()4 J2 P" z. k9 s

2856b94b0ff5bf4357137987d7c167b3.png


  • - k% J( l/ E" N. G: B% J
  • * }/ X9 ]0 p3 h! y- I4 G

  • 1 e; T) u) {9 a' w" `, N

  • # }5 g8 g+ S$ {

  • , |! E0 \0 |% z2 Z4 \, H; D
  • - U+ i- ]' P5 I: T- ]

    ' c+ U/ e0 g4 M1 T5 `" J$ \; N

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()5 D3 ]) H7 x; R) Z0 [# a; i

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • * \) b. f" Y# y7 h$ m* p8 O4 j
  • 3 a) z4 I1 h& {# X
  • " A+ r7 M9 B& I% c" T& S4 T5 @
    , V2 e+ W/ R* S& ]. }' V& i" v

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片/ W+ h& G* N5 b3 }' K

# }0 s9 Y3 |" ]3 ^0 g

绘制时间序列图

例:以三角函数为例绘图


  • ) V. t" X4 A2 X1 G
  • # q$ `2 U) X# _1 b" p6 ], j
  • 9 Q( I+ O8 I- k% v, }3 J- G

  • / w/ ^( w, d- q# |! t, \
  • 2 [. m# l" w/ B* b8 \# z8 o$ Z
  • 8 y5 ~! S" O' s3 \0 i

  • $ U/ u) S! M7 A- S
  • 1 T+ x2 W# W& K+ N" v! n8 e6 b
  • ) |8 S1 v0 N  G# l( ?
  • ' {2 R: E, R5 w3 P$ T7 L; j, I
  • 3 b! S! g1 K7 Q9 k2 s3 j
  • 9 Z' T2 w6 ~: Y) v
  • 1 ]" K- V# F1 X9 E9 u0 W+ P
  • ( s  }+ D" t9 M0 o# Y/ d  C1 z

  • 2 T. V" M& u; v/ [7 x( T/ g
  • 0 Y# b7 Y9 x' s# [0 e5 b* p$ g
  • 8 k4 w; c/ V- `  B0 a# `: X" ]
  • * R+ n" _0 ]( [$ L6 a: a% u, j

  • 3 b+ T+ G+ g- ]
  • & U' x% c. Y% Z; F3 k: a

    % U! j5 L! s5 F& z# i

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()1 V, j. Y3 Q2 |0 v

7d0cd3e557628cb00d61b8a5a167f62f.png

% T2 x1 @- h" {4 U  {8 w


8 P( a0 G) W- X9 ^                               
登录/注册后可看大图

8 o+ s  M7 F/ w

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • 3 E6 o6 `+ H0 Q- Z; f

  • 7 x8 R' A. o  I" a( O

  • " K, Q# S' a6 d& K1 s2 S/ ?* o

  • 8 h+ E  \' u9 ~6 D

  • 7 H3 f$ T- K7 S! n

  • * C2 r; _% `8 ^
  • 7 E" k( B6 f6 n* [

  • ) `: S0 s* r( n) [9 ~7 j. A& _2 @

  • . ^; m1 S6 c7 w6 m6 O
  • 5 A2 N" V2 U2 X) }# I, W" |

  • 9 s& Q9 Y) I/ v9 j( t9 R# M9 l) T" _

  • # C8 T+ M. P/ ]3 v

  • ; }6 i$ M/ t; B, p7 B7 \
  • 3 i  e2 b  T, t- b* Y
  • : g" i% k  G' E7 d3 R/ W. K
  • , q: ~8 T% F6 H# K

  • / x8 V  q! G, a+ w$ C! B# O' d
  • 6 `3 ?* L& x% d0 G$ J1 e$ Q6 ~

  • 0 }. ~/ N4 S4 J( S, u
  • . I/ t! e6 P2 l' Q
  • 2 @" y0 b9 a2 N: {6 k
  • 0 D( |$ Q+ g. F2 W- c
  • * U+ k; I' O' g) H2 M! z

    & u# r( o/ T% |& I3 m7 W/ n

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()
  c! z0 R; {. K2 x8 ~

1da850d5cdd66b7f685d1f819c9f7321.png

2 [8 q8 u. i  i* o; C


3 T3 o. f8 f3 @3 u0 L' _3 w                               
登录/注册后可看大图

2 m/ `6 C" b: S1 b

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

回复

举报 使用道具

相关帖子

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