|
温馨提示 (1)本号分享的有关python的经验方法都是基于anaconda下载的库包(conda install 库包名 或 cmd 命令 pip install 库报名),以及使用anaconda里的spyder(python3.8)编辑和运行代码。 (2)所有的代码都是经过了spyder(python3.8)正常运行得出结果的,可以放心使用,也欢迎交流和讨论。 (3)使用的软件以及不同版本,都有可能会导致代码运用出现问题(不代表分享的代码有问题或是错误的。),关于不同版本运行本号分享的代码出现问题,请自行网上搜索解决办法解决。 (4)如有转载或分享请注明出处,尊重本号版权和辛劳,谢谢!如有侵权敬请联系删除。 + V; U* S( ], x u2 _: o
Cartopy是一个Python包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。Cartopy利用了强大的PROJ.4、NumPy和Shapely库,并在Matplotlib之上构建了一个编程接口,用于创建发布质量的地图。cartopy的主要特点是面向对象的投影定义,以及在投影之间转换点、线、向量、多边形和图像的能力。 # n, \: [5 ~. L+ C; m6 }4 O
绘制简单地图 Cartopy公开了一个接口,可以使用matplotlib轻松创建地图。创建基本地图非常简单,只需告诉Matplotlib使用特定的地图投影,然后在轴上添加一些海岸线: 1. 使用anaconda安装Cartopy库:
: n$ g( s' M& l: Q% \. M1 q- r1 K2 h) Z6 t- A8 `+ ~. G; Q+ a
conda install Cartopy$ Y$ H$ K8 J7 k9 C! `. s3 n+ h
# k1 C- I0 E$ W# ~
& P. V. @* O6 ?' C& [ c
O5 h3 Z( y$ a6 @4 Y2. 使用matplotlib.pyplot(plt)绘图: 例1: - # J+ y; [* ]+ _8 T( p
- . c4 x! D$ ]5 O9 ?+ X* J
, C+ j/ g' ]" a- % z* f6 J! Y6 V
- , c+ X9 T) m7 O/ u# o! c
- 6 }5 l; @) ]5 F: H' U3 N
$ o* `+ N1 k4 b. |' F/ B) M: r
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()- B0 r* d1 M' K. _: R' A' K
7 }' ?4 Y6 |! f5 ^9 X2 {0 L- . d% d6 c, ? u5 C2 I- j; U" A; a
* X1 K2 c% I4 @' n& q& {- $ a7 K1 A3 T5 X/ _. n! B' u, G
- - Q" P- X: x5 r9 }2 W* W
6 ~1 x7 b: N( p+ |
# C7 T* u# Z; n8 c0 z
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()2 a: y1 T9 Y2 K% x2 q
图形保存方式: - # v0 x- u2 |; l5 q# }3 z
) a: d' P4 f6 z+ s" E8 {8 ^. q. I& s- 7 R) P! J* V* f& M6 ~( w: I6 e
. m% n1 x& |' E- z$ }, e3 V
# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf') #保存为pdf格式的文件plt.savefig('coastlines.png') ##保存为png格式的图片 W/ v1 C' m& S6 f/ y; R
3 f* ] z6 H. G8 k8 ~绘制时间序列图 例:以三角函数为例绘图 - 0 t- X* R+ v1 z: c" a2 ~ S. O
- 0 ^5 ~- k% }4 |2 D3 i% L" \
- G! O' {0 V( e( T, P" h
- ! }, A; R$ M9 H
- ) ]2 T2 }) u- K; P
# @9 X: p7 `" E5 }3 `- # a1 o& E, N* H- d, X
- & k% [0 F( q, }
. X. o$ P# r$ v2 F2 f; L
$ f4 ^# ?0 H0 S; ~' I- p# o* M
1 S; {+ U& S" w: J: j8 \: o- ' }2 U, u9 ]* E& x7 ~, p& L8 s
3 ^7 T4 y* b# a) v4 S# C- 6 C$ E3 q4 z' |9 N+ ?, ~
: a1 B; L9 L5 P
: y% z- p `- y% Q* T3 L
/ Y5 j7 O3 B# F4 _& |
' k8 K: y4 F$ y/ V, r! m4 g3 u
0 E# u: V7 X5 I" p- c# C3 x+ |- 2 [1 H! I2 \ c2 Z0 W
- d/ p) O6 b7 A" g, h- [) g
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()
4 X0 L) w. V7 j* k) G
+ y8 h! G( W5 e$ C! @9 n3 s/ _ % m/ }- \" A9 J0 u9 C& i. C( C5 m; R
以某地1979-2019年平均气温为例绘制两个站点气温时间序列的子区域图: 数据内容如下:
& O) I1 b/ X! S: d' o! G- L
" G" D i" m# T8 a
9 z" e6 y, a6 z7 R g# Z- % n0 x8 n" |* J: W
- ' C v/ ]" a. I2 ]
- ! U0 n O) J6 A' O* V% Y) [5 C5 ]
- ( c& l+ I9 R: C7 ^8 c. o# B) i
1 f7 {8 w6 I5 z6 R8 Q- }# J5 j
( ^ b( S1 W2 ~# o
9 |2 ]8 b1 W( }0 x5 W; Y- $ R$ {* I& K+ f% Q: C9 Z, z }
- # v0 v% [2 R9 u+ D" l* }
3 L% C. o! r7 c% x( h) Q
) h9 Q+ f4 G/ j: _; Q. c
2 G% w) ~5 e. M& L
* N& i: G+ t4 W# y L- $ O0 x9 V! @) M; S! M( X# s
6 H6 B) M' z1 G( z- + w' B. M- r6 [
" J; ^6 b, p& P% _: T# S" g" U
; s" r; I K& I2 b( E; z r4 D
' E3 N% D* b) T( z( N- 8 t# Z9 E9 @6 n! ~: I+ D
: V0 a& r' |; l/ c
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 P0 X* i2 p L; A
) q" Z4 }" e2 C8 c" D+ I' n$ G) n
+ g& g4 y, Q, P* m使用matplotlib.pyplot(plt)进行绘图时,直接使用plt里的函数:使用面向对象的方法,先产生一个Axes对象,再对此对象进行操作,实现绘图。 |