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

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

[复制链接]

温馨提示

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

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

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

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


/ K. E. i' @9 C+ f

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

7 v$ S5 _: ^. ]* X

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • ) n9 o& y9 j* S0 p0 v1 L0 l
      g! E' n7 j% F* |

conda install Cartopy/ f# C% ?3 F, O1 R2 Z- Y


$ ]" C' W. v! |1 S9 C/ [4 A4 l$ v' |2 x+ J  e' _

1 C- `) Q2 C/ o0 X- P1 S

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

例1:


  • , w& r; k" g% P, i! q
  • ' X. `- N3 K; M' S: L

  • ' s2 l8 I! B  W
  • " T: F0 Q1 c) ^5 @+ D5 B+ G$ j
  • $ N" H) {* f/ A* \& @  E; ~

  • 3 D( [# n6 E1 y
    % M+ b5 r- V! G7 y- k) `$ ?

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()$ e# N/ S0 N/ [8 a2 }% A& [

2856b94b0ff5bf4357137987d7c167b3.png


  • . w1 ]# i6 X& y" [( ^3 Q% r

  • 6 s' l. u( Y$ \) p- g
  • / w# ^3 `0 `* I" Z
  • * A: s1 g5 U  y, M7 N) z9 e$ [/ x+ j& h4 t

  • : m' ^% k, f7 ^. E: f+ X1 \" S2 @

  • " W+ F2 A( p1 o2 U/ Y1 U4 J4 R0 E
    4 v' T5 d0 }' _; x+ s- s

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
1 M- S+ L6 n  y" ]4 S

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • * ]! ~# \$ B7 A+ j
  • & j0 q6 _: H" C# r1 P  W* P1 c3 x

  • - }, Q1 R* M$ ]! H0 j! e3 y/ i. A3 K' x. p7 |; A3 v# i

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片
8 k! v9 W$ `+ N0 ~% ?0 I/ J7 r& K

- S& O% F+ G: S2 X; I& F

绘制时间序列图

例:以三角函数为例绘图

  • 5 ]# s2 w( i( v7 o

  • 7 h# h# W1 q9 F+ J

  • ! [) d9 r' S+ \) U- ]' w
  • $ z2 p  J. z, r/ U
  • 2 }6 ~+ U5 A! E( F' l# d
  • - M, @9 O0 F2 A& @3 f$ L' i6 A/ c

  •   V' s# C, C4 b3 b5 k

  • : K; L' l4 f3 `1 O5 G; k

  • - ^+ W6 t* T' ]" U; k

  • ! _, v# A7 S2 D; n8 ?% l: C

  • , c6 j8 e( B" s% [

  • 0 C; W7 l. y4 l1 Z

  • / B7 ?" G9 L8 b+ |
  • 4 I8 \/ w9 u1 h

  • 5 Q: {4 N# ]) Y2 _
  • , ?* ?2 Y5 d- e8 b) K$ }
  • 2 ?1 d' O# b( w% e2 ^
  • : S3 a1 g; a$ M2 H+ Y& T
  • ; `& {5 v5 E/ i( o# `

  • - d; e2 O" J# m! i8 r; O) y3 n' x0 Z% V, U8 @. e: c

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()" g3 i% y7 V2 V: U: X  d! \

7d0cd3e557628cb00d61b8a5a167f62f.png


. q! T( o8 x9 ~3 M6 ]


5 I/ p. Q7 C6 p" M& q1 {( k* R) \                               
登录/注册后可看大图


) i. a0 u& a/ e

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • ( @% P& w. W4 j+ O
  • $ z+ x8 O* U# V

  • # P- Q. k) i8 l
  • * Z5 H/ y" D: v
  • 1 l& j6 H  n! t: x2 H& Q& ~

  • ! ^6 X4 S& {. V6 x1 r" |) o( O  `
  • * a, K! b3 r9 }. T- b
  • 4 F" E3 @. o2 k" L$ g

  • 1 o$ O# l0 a6 p# P1 k
  • 7 I, @5 ^0 ?- l: e

  • . Y8 h: u( l0 \: v: n3 i- R3 \3 B
  • . q$ y# M9 l3 d3 U, ~) g: [5 s% k: N. ^

  • 5 Y/ O- I* @& w7 l2 k
  • 3 d; M+ m# y. }* w2 n+ {; t/ N9 u
  • / q% g* w7 _/ ^6 V2 c% i

  • : h" i0 M  J+ v4 v7 l5 n! t

  • 7 X2 K8 [) e& A! s. N1 D4 V
  • / b/ W6 ?1 \( {! |2 v; n0 I6 v
  • & i4 @1 |+ s$ W, v- p
  • & |  m$ y' b0 U  ^6 |
  • 4 @$ |5 z1 C2 x4 S
  • ( N; ]. E' U- |% H0 Y$ X# x
  • 8 X; X$ g: A1 ^; ?* t) d
    # m: y: X/ t8 e" T! X5 v9 t

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: x5 }! s. i! a; H5 @# S' D

1da850d5cdd66b7f685d1f819c9f7321.png

0 K0 ]* O9 J- `* E! x  s" Z% a

$ n7 n, P: B9 o' {) C
                               
登录/注册后可看大图

. O, D5 y; [7 @+ P2 `9 s# C: @- i( b9 P

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

回复

举报 使用道具

相关帖子

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