温馨提示 (1)本号分享的有关python的经验方法都是基于anaconda下载的库包(conda install 库包名 或 cmd 命令 pip install 库报名),以及使用anaconda里的spyder(python3.8)编辑和运行代码。 (2)所有的代码都是经过了spyder(python3.8)正常运行得出结果的,可以放心使用,也欢迎交流和讨论。 (3)使用的软件以及不同版本,都有可能会导致代码运用出现问题(不代表分享的代码有问题或是错误的。),关于不同版本运行本号分享的代码出现问题,请自行网上搜索解决办法解决。 (4)如有转载或分享请注明出处,尊重本号版权和辛劳,谢谢!如有侵权敬请联系删除。
, n' r: F" Z0 xCartopy是一个Python包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。Cartopy利用了强大的PROJ.4、NumPy和Shapely库,并在Matplotlib之上构建了一个编程接口,用于创建发布质量的地图。cartopy的主要特点是面向对象的投影定义,以及在投影之间转换点、线、向量、多边形和图像的能力。 / F" T- A$ t: b! ^1 o
绘制简单地图 Cartopy公开了一个接口,可以使用matplotlib轻松创建地图。创建基本地图非常简单,只需告诉Matplotlib使用特定的地图投影,然后在轴上添加一些海岸线: 1. 使用anaconda安装Cartopy库:
5 W+ z. O. |9 N( j) t1 F& n$ l* R3 X! N: f2 T5 g3 k
conda install Cartopy$ U3 m1 Q. @5 a2 x
% i1 Q% O0 V/ H0 l8 I# c2 Q3 y# ]% a
; w- U6 j2 ]. b9 `4 ]
, K( @+ s/ ]: v6 N2. 使用matplotlib.pyplot(plt)绘图: 例1: - ( w/ o& j. ?. z5 U1 O! ]2 d
8 o8 o T* p' s. j3 z+ ]) L# u( x. j) a- * P E6 T' \% e' u: C G8 Z
- ! V6 } O* }$ y& O: F
. x9 Y; t8 M5 y7 S. I
( ]1 c8 t- |, e6 W0 v W" W T0 ?! @. @: h
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
( B& f+ K7 v) S) y( F5 ?9 Q
' v( ~: D0 O4 l
' ?6 F3 B( B K; u2 Y7 c2 j( ]
1 o3 i: X, f% u- x5 } W( a. Z x& l+ K
8 Y+ f7 P3 a: t# X! X/ U6 f! a5 Z
k w* C, P$ k4 k* d# K. d
* M6 J. E& G) m0 u5 K* g
( X% S2 c$ X3 M3 } S2 Q) z
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show() u6 j& s! { n& n0 L
图形保存方式:
0 [" t& `( Q) t G
8 m1 ~ X, X$ ?- + Z/ U: ?% X5 I( U
7 f2 O( @7 k6 T8 @( ?0 T+ h
# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf') #保存为pdf格式的文件plt.savefig('coastlines.png') ##保存为png格式的图片
D! H# v1 P: h
/ v# l+ b/ W B: j) |! |5 A绘制时间序列图 例:以三角函数为例绘图
! F+ V4 p' c1 q& t) T0 H
( u0 [5 N, \& ?: q9 M
+ T+ ~8 m8 Y( _- d1 v- 3 D u, o! b8 m) t0 T8 j2 K
- 6 h7 z B# X- F+ _
* w0 m; R. t+ l$ I" S0 k% x
& K6 w3 M1 F1 h" R x- 3 T! g9 F7 n1 N: j- E: J8 u0 O5 u f L
1 {) p' S$ p0 C+ p& Z5 w$ S) K( Z) r f- 3 D" Q9 Q m$ |, h: F
" c0 H& Q9 _& Q! |/ C* l
9 m6 p" k- @9 G R
: T- D! K6 s8 m/ X5 c) I3 f+ u8 @- ! L9 V, m J0 l- u$ l
$ ?) Z, ~" H' l% R* W% v* C0 b
8 a( H$ U2 {; t$ t* ~& v* V
9 D$ T- e5 j) ]2 n+ e
4 k2 p6 e/ }, Y. ]# r8 I: j0 Q4 _
2 \- U( x# B3 Q R. f9 A, O- ' M# H+ E- f! E* E1 R- p. f- n
" q) J0 D; T' l/ y! X
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()% W( H/ R( |+ j; c
9 T: ^7 [) n* X9 Q& u& G
8 Z8 s# t* |, `
以某地1979-2019年平均气温为例绘制两个站点气温时间序列的子区域图: 数据内容如下:
- ! t' y* d4 E/ y$ u) i! B7 r; a
3 e( k' _" ?4 F l- - c+ Y) u: ?7 Y& _
/ U5 `4 I( H5 I- , N. c p3 N9 X% y2 m, i
- - O! A; s! R: f" Q
- ' y5 i* V* j( `! _! d4 [9 b( e: J
- 2 a- I( F' a, H4 W- n. P5 Y' T5 ?
- # h, M* Q0 Z1 r; n, N c9 K
; N" B" o. a, v2 Z$ R7 t' v$ [" f
9 \0 E; B& n; ~: ~9 b& E: Z0 f- 0 H2 V( t# @0 L2 z. \+ D
- ) x! x9 C% v* c9 p: t# @
3 }- \8 t3 S' L6 ^
+ U- Q7 B- T* Q3 V! A0 p# V6 Y
& r& q. a; C+ ]: G: J- + N( d% e! F+ U/ Z" M- ^
- : c" Y- j+ i& b) k1 u4 Y1 B
- , Q% ?8 ^5 |9 h( T: F- c P2 B- o
- ( }) K+ D$ D5 n V) r
' G% j( M9 ~! O- U, n: ^0 A% X- D
! Z7 k* H& c' A0 B- 8 K# p( o/ J. t6 V5 [; w7 K! E
- L2 v% _" n/ U& a. X
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(); ]8 I+ M" ^- Q. p! `5 Q
7 |. m X3 B* V# ]) p
# L. @! O. h- C5 A- d* y# a9 r
使用matplotlib.pyplot(plt)进行绘图时,直接使用plt里的函数:使用面向对象的方法,先产生一个Axes对象,再对此对象进行操作,实现绘图。 |