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

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

[复制链接]

温馨提示

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

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

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

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


1 t8 G1 S% V3 C" h( F

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


: u" @0 w% T* z3 g/ a$ K

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • ! C! t+ W: N! a) B1 t; k
    " U, S! s& s/ e3 n4 Q

conda install Cartopy; _% m& e3 y! b+ T9 _; Y

: Y) v7 _% |- ?0 H3 }& E/ F
6 d- _$ @9 p4 a

* Y0 S7 d9 c: I' {7 K

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

例1:


  • % R4 j) k/ H( q: Q1 T
  • + W( W3 r+ ]. o/ |
  • 7 Z! X1 g9 W. M+ y' p6 q

  • # ~, P+ Q2 w  u5 v9 h7 N% E
  • & o' _# f+ X2 F4 a8 |
  • 6 p/ e5 i( D  P) ^! r1 Y0 U/ w

      g5 K$ Z' P, @0 ~

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
  r& y4 B3 V) w( H6 I7 w0 F

2856b94b0ff5bf4357137987d7c167b3.png



  • , a9 o9 Z6 J: T% ~8 i$ s. J

  • 7 z$ s5 a- U! }: k% u: `6 Q
  • ( w" a/ h1 `1 {

  • 8 I, b" l" n3 b! ^4 ?0 z7 L! R
  • ' s9 }, q. j- ~( T' ^
  • $ @8 E- Y: B1 u3 l/ T% o2 U
      K+ |3 ?# d% E* N

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()1 U$ w- S6 Z' ~. @% I

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:


  • ; u4 ]  N# u  t7 e- l7 ^& |
  • : b1 a) g; H) S7 n
  • 0 z! Q2 u5 o2 I/ U; q
      N- U1 [2 o8 J6 b

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片- L) {: J* T+ o# P: @* _5 g


8 z, ]1 O7 L2 w& m+ U. [) z

绘制时间序列图

例:以三角函数为例绘图


  • & k" A( o- C2 C- f
  • ( p3 o- {) g- T2 o8 o; B% |
  • # O3 s" s# S- D: |/ |' v
  • + |2 _, d5 y8 u% ?) l5 J. ?
  • / F+ W3 S% X  s% ?' W( m
  • 8 }5 `; L8 ~3 n# ?5 H7 t1 V$ ~7 J

  • 2 `$ I7 J) s, ?' Q8 E5 ]
  • ( E7 L( ^' s' p% H
  • # l9 v- Z: M1 N
  • " w; d  K2 B5 M6 n  I
  • - g8 D' \# r3 i( ~9 a2 G" J  k7 i5 Q

  • ( G" `+ f# g1 u) Z  k3 E" o
  • ' w4 y' U$ T- @9 |3 l
  • 0 I9 r0 n  S% r4 h5 N( j3 j
  • & ?* l5 J2 ~! l+ `/ k4 {

  • + P9 Q! \3 M, l

  • $ _4 I9 e  a& m, `/ o: o9 F5 w

  • 3 N0 _( g6 O8 b" y. _7 L

  • , p6 d, L/ Y6 m! |3 k

  • , [* y% P" P6 M6 Y
    $ ?+ F/ ]; y1 P# m# B

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()
; ]' b, D3 B  k% @: I2 ]! O' W% A

7d0cd3e557628cb00d61b8a5a167f62f.png

, y: @. D" F7 C( O, T0 ?$ H

5 v- ]% B3 l) G/ A4 U
                               
登录/注册后可看大图


, x4 o2 B% ^0 L7 L

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png


  • " r% t1 f0 a. ]2 ~1 q

  • 1 p# p( R) M# z6 F4 J, Z. g

  • 5 y$ l6 X% {# X

  • 6 E, l1 V9 g5 h% T0 \' T1 Q% l

  • & ~+ @8 |5 W- X& C9 A

  •   x; B4 k( |6 E. R9 [

  • 5 j: p( @: M: t) E% I4 o+ r
  • , l$ _( {" I8 v- t1 e: q
  • 7 i$ x: G6 Y: ^
  • 4 P- v# n+ @  N$ Q

  • 7 S. J- s, O! l' x) d+ P6 U$ F, e

  • 3 L: Q6 L. ^7 K  a; B. i9 }% X
  • % N/ u) I2 G/ e* d2 y  ~

  • $ h( G9 J$ ^- c/ `3 O1 a) D( t

  • + ]' q4 H; i! x! G

  • 0 u% M$ W: d, u

  • 8 q5 T' S0 U: G

  • 6 S* T6 Z3 _/ d# C
  • 7 ?* U; ?: o% s0 ?' c% q1 o8 C! W

  • " ~. v2 v; J7 G

  • % N, k! G6 P* w5 \+ ^

  • " I, Z' L/ C; Z. |
  • : L. n- ^, B6 f6 u) X4 b

    5 n3 Q8 P5 p' @/ p

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()
; \, E) ]# N/ Z, {# |! W/ C

1da850d5cdd66b7f685d1f819c9f7321.png

- ?& A( _4 n% z, A9 L6 y

% V/ f% r) d/ }' @$ V
                               
登录/注册后可看大图

8 j2 h  l2 l) ^2 `& P; \

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

回复

举报 使用道具

相关帖子

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