|
温馨提示 (1)本号分享的有关python的经验方法都是基于anaconda下载的库包(conda install 库包名 或 cmd 命令 pip install 库报名),以及使用anaconda里的spyder(python3.8)编辑和运行代码。 (2)所有的代码都是经过了spyder(python3.8)正常运行得出结果的,可以放心使用,也欢迎交流和讨论。 (3)使用的软件以及不同版本,都有可能会导致代码运用出现问题(不代表分享的代码有问题或是错误的。),关于不同版本运行本号分享的代码出现问题,请自行网上搜索解决办法解决。 (4)如有转载或分享请注明出处,尊重本号版权和辛劳,谢谢!如有侵权敬请联系删除。 ; `' z4 r8 N; \6 z5 V
Cartopy是一个Python包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。Cartopy利用了强大的PROJ.4、NumPy和Shapely库,并在Matplotlib之上构建了一个编程接口,用于创建发布质量的地图。cartopy的主要特点是面向对象的投影定义,以及在投影之间转换点、线、向量、多边形和图像的能力。
" v. U: u" S7 I! E, `: J绘制简单地图 Cartopy公开了一个接口,可以使用matplotlib轻松创建地图。创建基本地图非常简单,只需告诉Matplotlib使用特定的地图投影,然后在轴上添加一些海岸线: 1. 使用anaconda安装Cartopy库:
4 V4 Z+ |; S1 s; P1 I4 V' [- p; b) d+ c1 t. w, z; v
conda install Cartopy
* Y5 d! R& d s5 j
$ Z1 h0 Y9 l( R j" }( {" W9 J; x5 n+ f5 \" G: x. `6 F3 \
( ~6 w: U& q0 ]1 Q" o P T; P6 B0 K
2. 使用matplotlib.pyplot(plt)绘图: 例1: - & f+ i' `% Q5 M7 {. i+ I& ^- v) S
7 q' w' C$ j' s3 m- s X- 4 j+ T6 }3 j$ u0 h X3 O% u
- ' N2 n. x( M) l2 \$ |. [9 I
- + t0 L- a \& `. }2 t$ ^
3 }6 g& q3 R& ~1 \% L% x, H/ R9 [2 @5 G+ N* B" Q
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
9 v' G! E, ?, m# {
- : H. O' q% [( Z
- 8 F. v5 i1 v3 M4 H6 L9 }
/ {5 y" v9 W- w$ U4 _. t' c! M- ; R8 ~# @) r O4 b. W
- 1 q [& ^& r5 |0 o! Q2 m! c' E) h7 ]
- 4 S: C! Y" N& S- f' S i
; b# L/ ?3 E! C) `
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
; g* P; ]2 d1 p" A L
图形保存方式: - 4 B6 P' v- g. R: C/ Z
- 1 L, X4 m+ g3 L) x e
) y# m& D8 n4 I" T
! E4 H1 o2 z3 C/ a$ I
# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf') #保存为pdf格式的文件plt.savefig('coastlines.png') ##保存为png格式的图片0 t' I* S0 q; O& X% h/ q1 J7 Y
2 t2 {/ P; R* `& K& ~, x2 I绘制时间序列图 例:以三角函数为例绘图
3 d! p' Q; z" c* y+ @4 p( m3 [' P
- u7 c$ N+ t' b; C" @( C. k- 1 [, T. c* b" E4 V
- # f6 r( ^" P2 v% I
4 W! |" C) u0 ?& t- ( z( h' {" N7 b3 v
1 J+ J* d, Q9 T) g& r! E" [ v$ o
z. w* x' }1 b/ H$ X
7 H2 ^4 i/ Y2 S: N7 ?- $ }0 x# r3 l/ x- u# a
+ [8 O- ?% R3 J4 ^6 j4 }* ~6 X5 j. A- ( g% l: K: H4 p* z$ Q. M' H( i
5 y! m. H* t; `) K/ C- 9 o2 A9 r9 A# M
- n) M1 A2 x) D, `1 ]2 U, k
. A' v' i% j! Z( H w* g
# s: }1 x/ Y" N( b# {$ ?- * j( I& a+ {: C& J
9 J$ H' r1 r! ]& I
& j1 @+ H9 ]$ Y/ F9 }* Y, N/ [- u
0 }& i# W. a9 R/ i0 p g8 ~4 y
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()* v/ f5 @! D% E5 u
& v' `% o0 R+ I) I9 Y: Y1 B2 R
7 p4 ^2 L3 {2 v; o5 B以某地1979-2019年平均气温为例绘制两个站点气温时间序列的子区域图: 数据内容如下:
' U* \* L( l3 S- l; F1 \
1 i/ X4 F6 N7 |. p- 6 N6 R" R D: P4 H
- 5 i0 R: O, }3 R" F7 V$ {
& ?) d2 `! N* Z @' Y3 S7 P
/ \+ c0 ?, ] m S, U( R1 V5 W- 6 l' ^+ I$ d( A# i
- 8 t4 S& A& H7 i& l$ }# y" M+ a* M
( i8 p4 g2 A2 E' g; [- 1 f% J- h* [) s+ e# z, m4 ?# ^
$ @, F; G: u2 w, M7 Q; e% g- " m2 F& ]; A' Q
- 0 k, `$ W; O! ]( g+ X
0 k7 t7 @' p+ U8 e+ P, J
. e& J5 \* v% d& Q- - c3 U% O2 n7 L5 z2 c7 ]
" H# `/ q$ }7 o
+ Z% {& H& K# N( y7 @: J4 y. \- 5 c" v: |, Q; _- o# P" V
- ) z# f9 U3 g2 n( T3 d
. v( p8 o4 x4 a8 z7 }1 t4 l* ?/ K- 3 D! {% Q% M4 L
- 5 V2 S$ z2 j A& ~2 ~' \% Q: x6 I& M, L
+ i# q) o8 Y$ R: f. S. @
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()' ?1 P+ X$ q& ~2 W$ T8 | q
3 ?8 o- A4 p, T" H% n4 C4 t8 S 7 A/ e$ }: b0 m6 h1 O0 l
使用matplotlib.pyplot(plt)进行绘图时,直接使用plt里的函数:使用面向对象的方法,先产生一个Axes对象,再对此对象进行操作,实现绘图。 |