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

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

[复制链接]

温馨提示

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

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

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

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


+ F4 n8 Y8 X4 y: n+ |3 l

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

9 r- Y8 O8 v8 [3 v1 [  g

绘制简单地图

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

1. 使用anaconda安装Cartopy库:


  • , \; D" s1 K7 n, M! D3 \5 Q7 Q
      u; w3 l' N! h! Z- F

conda install Cartopy% z2 \. Q1 o. F


6 A' f" A& d$ x4 s* _( G! T
: N5 e, x& w% F7 g$ r* K2 F5 C7 H! [6 Y

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

例1:

  • ' l; q- q% [4 N2 j% |$ G

  • $ h! O( C( Z, N7 ]- K

  • * W( a1 ?6 e' b$ I, G* q  Z
  • 8 s+ b! ~. r- Y
  • 6 U5 y  [4 W: Z) F" Q8 w
  • ) W! k7 B4 E! W, z

    7 e; q: r- [' w& C( m" h2 T! ^& n  x

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
* z9 [9 l; O# G/ H) F

2856b94b0ff5bf4357137987d7c167b3.png



  • ' b* N* E3 y2 P- ?
  • 2 q( o9 U/ z: ]$ `
  • # [' ?8 F' o: m- W+ f4 w: x

  • * w7 H4 G# {# k5 _
  • " [& `5 N+ m+ ^+ [% y3 S+ G" M; q

  • ! r. d" g! T3 @6 E* J! O
    0 X6 T! [6 W( q) `) p$ g

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
1 y5 S! f; g9 K: q' S+ @9 W

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • ( {. E+ }" k5 p9 C) N: X" K" D

  • - V, w) }2 H! u8 y

  • * [* `- o3 |' o7 x! f
    0 u8 D) J* v9 u% [7 k$ h/ ~

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
9 s  f- V# z+ @' E) k  |+ K

  y. v4 H% [2 B0 O0 X

绘制时间序列图

例:以三角函数为例绘图


  • , E8 D8 Z9 Q! s/ z! {! n7 h) _: Y) V

  • 1 p# D* s1 ^' _+ F  P% k- ^

  • 4 k: D8 e; j; e5 A- \; j
  • 0 ]; R# @- V+ q" |

  • & J+ n: t, ~+ o  ^3 S2 R

  • 4 N& t/ v6 I. a1 l8 I! s8 j

  • * \9 _! j" Q$ T/ n2 k8 A
  • 7 u. m& J4 v9 `# `0 b5 K" @

  • ! P) g0 {* ?$ j  n* }2 ]9 F4 G
  • 3 G+ I+ ?/ Y: U8 \% S. F

  • % h' T1 g- a8 ^7 R5 ~
  • * ~5 j8 z  ~1 X# s4 n0 U

  • $ P. D  y9 I% e/ [7 w. G0 v* ~0 m

  • + c+ @  d% `  A
  • , |* d0 y! ~% H; _7 }9 }

  • 5 V2 \+ O+ Y9 T0 I% U
  • ' t3 a6 O- W, X8 A9 X# }

  • " |- L$ `$ J9 ]4 ^' C6 \

  •   L. ^8 J6 J9 ^. I+ R% c; U

  • . o) K* @' A: v7 c! U0 V  s1 l8 r- T' m- W- F

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()
0 S& w) t2 B: l

7d0cd3e557628cb00d61b8a5a167f62f.png


( d6 `. D% |* @- a& o) H$ k6 l: g


1 Y- O. y3 g$ W3 E                               
登录/注册后可看大图

( Z' P* a3 Y, ^& M) N

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • # |' D2 W0 B: s1 {  \

  • ; a5 p& ~4 N/ V8 f3 X8 _7 @  b( ~
  • # e4 \( S/ D! p) o$ u

  • ; g$ f6 j4 y# E1 Z

  • 6 Q, {& e; ?+ e! S0 d

  • ) ~# E2 I* e9 b2 }& V( F, z
  • + |2 A3 c5 D' |3 J( w  y3 F: }

  • + B0 {; s: R& ~$ E. f% f4 N( q8 K
  • 1 C9 R% V$ n% x4 r' C1 v
  • . M7 r' J  y+ r! S# r$ F( j

  • . s$ I. W+ m2 q0 B
  • ( R; s+ j* r! ?- U/ V

  • 3 Y$ L1 v8 N: ~, |( E5 n

  • 3 N+ z* w" S# Y& p3 s1 @$ c4 s
  • 3 w* [& x0 _1 K# ]; v
  • * g1 I7 h, x/ |1 O- r& b6 E4 C

  • ( m7 C5 Y+ W. N  @7 n

  • , m* S* ]7 z3 R  c' F& t: o
  • ) x) Q1 K. X' A+ `
  • ; o# S) [- w/ Q3 B% z! }8 h7 `

  • 8 F. [2 ~1 \7 K" t1 j

  • 2 Z4 a$ f9 I! Z2 r
  • 1 H% k/ p% _' b4 ]$ Q% [

    0 @8 ^* F/ q5 A. q

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()
' v, ?) Q4 k) D- s, h

1da850d5cdd66b7f685d1f819c9f7321.png

7 N5 r: d# z( d5 y


  k$ \2 I( ]1 I# u, ?                               
登录/注册后可看大图


% }: z8 Q9 H1 C0 @0 w

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

回复

举报 使用道具

相关帖子

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