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

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

[复制链接]

温馨提示

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

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

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

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

  c$ M$ `( R" M6 C: `) a0 z

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


. p4 }" Q$ J- W/ X

绘制简单地图

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

1. 使用anaconda安装Cartopy库:

  • 6 S6 U* P  U2 K, G9 l* x6 ^+ P

    # `, P4 S( d3 t7 ^+ @0 e) h

conda install Cartopy" C' g; R# j/ O6 W


5 y+ F+ l9 ~9 g2 B- I4 ]9 J0 C7 U- k

9 }: b" k- b3 o8 q. C

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

例1:

  • # B+ p7 G6 n# ]  _0 i) @5 W

  • 3 Q1 s8 P& N& O5 e& O  I- f8 m
  • / p$ s: M4 Y) O7 U* M
  • ) R" O  f7 |* Q" ^! C1 x* u6 Y7 G

  • , C# f# D% L/ Z- J6 E# c, r

  • 9 ]' a$ p0 k" E& p" q' O2 ]' q  D: C; U8 [. @' H

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()5 h' T  U4 ~1 w1 q0 C* e% F$ e8 e6 p7 a

2856b94b0ff5bf4357137987d7c167b3.png



  • 8 s- \" o8 O7 S' Q- k6 E& E; [" D' _

  • 3 q; }. U/ ]5 t& t/ t

  • 1 K9 C" W6 p- W8 W
  • 8 s- I7 o8 P7 ^& w$ c

  • 2 w+ h8 J/ Z1 e$ i
  • ) R' X9 d/ f5 C. i, N; y& g
    7 E; {. t! J: ~/ k; s* m7 c) V& I

import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()% |/ g/ D2 L  l0 E: p

412be390a09c8ebdd3aa7a145b96ce03.png

图形保存方式:

  • ; y. F: T& c' x; i' @3 g

  • 7 g5 p& @3 v3 k6 s

  • 9 t" h& M, m0 |
    ' j' d: B, o0 S7 \

# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf')  #保存为pdf格式的文件plt.savefig('coastlines.png')  ##保存为png格式的图片7 M8 L- g, g  {1 y

' w/ p9 |* O( D+ O; L

绘制时间序列图

例:以三角函数为例绘图

  • - [) d, h# x% Z, I) \  t/ t" l1 [

  • ! K( Z1 P1 L7 z2 J

  •   u5 X9 K" \4 d% R" \

  • # a1 P& X+ m( i: f- ~6 ^7 |

  • 3 d( p* p3 v* D  o7 [

  • $ P+ i5 T% r* @0 [

  • 1 ?5 Z' w: |1 K+ X/ e

  • 5 r! W! I( `. f/ b

  • 9 K6 ?  C3 F2 H, @# Z: s9 O

  •   O; C* P3 d8 _- [6 S
  • 4 u9 p" P* g4 F
  • $ J. |" b1 f, a

  • " i1 \1 f3 V: i( V

  • ) ~1 K( `6 T4 O2 v0 x3 i: w
  • * O: x4 ^2 L8 c$ p% a9 @

  • / G6 P* m, g6 o  O& l
  • 3 y4 r( G" e) i4 p0 L' h; z: h/ O. Q# n
  • ' G$ E# y- K# p

  • $ g" {7 Y/ l' P

  • ' o9 B9 P8 Q3 I! w# f5 ~" y
    " _  L3 m- u5 P  u& s( T

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()
+ Y9 r; J- W; r  R2 Z9 x

7d0cd3e557628cb00d61b8a5a167f62f.png


2 @( C+ c3 A. v& G3 |


& F9 B# G; ?; Y                               
登录/注册后可看大图

3 H8 l" K! b9 `6 s; V# E4 U- {

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

数据内容如下:

a086be97e02eee3b7d6686beab666d04.png

  • . w+ |" _) |, o8 D  h6 \

  • ) B3 v0 B8 ?2 V& A2 W" D2 o6 u
  • $ J* T, {9 e; V  M+ v
  • 9 K2 T$ |, Y2 {- ~" S, M# {% K2 h& f4 b

  • 2 [! @% g7 x  g1 l- L& d4 y
  • 9 `; @( s! k8 E0 ]8 M) F4 r) U
  • : m4 P, X* @$ W. t  r3 j

  • $ y/ |) a% i2 [* w

  • 2 Z5 `4 ?8 ]1 B# w( {) Y7 K* s

  • ) F- ?/ W/ P1 N( A. L; |* B
  • % r5 G5 H1 T" ]8 ?* {
  • . J3 K- q8 C4 O6 U! k/ j- Y
  • / }8 l  f7 z/ I+ M' {  R! n
  • , U7 A; b8 j* C$ _0 `' }, q

  • ( |; V" V3 Q7 h4 B( D/ z- {
  • 7 T' D) [( z) Y( r
  • - N$ ?/ E: G1 v

  • ! G. |' X  e9 P4 |1 K+ h6 f( I: O
  • 4 D2 v- A9 p, V2 Z( |; Q0 L

  • 9 L  ?( Z5 F' {  {! ]& Q
  • . N2 [" S2 d+ _

  • 2 Q& |  l( k  s/ l8 e
  • ) B& F5 }0 \. A6 p7 {, L- {

    8 d! `8 o4 W, Q# X: J! L

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()& d9 b5 V$ Z7 M9 O% x4 _4 W  |; ^

1da850d5cdd66b7f685d1f819c9f7321.png


: V( {/ B+ M( G! Y9 D3 {


/ u% N2 I0 ^5 j: A! A, L% Q* [# u$ f7 G                               
登录/注册后可看大图

6 }" b3 n" U% F( ^5 g9 w

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

回复

举报 使用道具

相关帖子

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