温馨提示 (1)本号分享的有关python的经验方法都是基于anaconda下载的库包(conda install 库包名 或 cmd 命令 pip install 库报名),以及使用anaconda里的spyder(python3.8)编辑和运行代码。 (2)所有的代码都是经过了spyder(python3.8)正常运行得出结果的,可以放心使用,也欢迎交流和讨论。 (3)使用的软件以及不同版本,都有可能会导致代码运用出现问题(不代表分享的代码有问题或是错误的。),关于不同版本运行本号分享的代码出现问题,请自行网上搜索解决办法解决。 (4)如有转载或分享请注明出处,尊重本号版权和辛劳,谢谢!如有侵权敬请联系删除。
3 V% n5 K9 T1 N0 Q5 sCartopy是一个Python包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。Cartopy利用了强大的PROJ.4、NumPy和Shapely库,并在Matplotlib之上构建了一个编程接口,用于创建发布质量的地图。cartopy的主要特点是面向对象的投影定义,以及在投影之间转换点、线、向量、多边形和图像的能力。
7 ~( X3 e2 d% `8 i4 m/ c6 `绘制简单地图 Cartopy公开了一个接口,可以使用matplotlib轻松创建地图。创建基本地图非常简单,只需告诉Matplotlib使用特定的地图投影,然后在轴上添加一些海岸线: 1. 使用anaconda安装Cartopy库:
, k& z" x( m: {9 U8 g+ a' q' \2 g3 |$ s( U$ q( s5 S' @" u( `6 s
conda install Cartopy
- y' h! F3 v2 l
2 D! X; g# O% Q% y8 F3 p0 i3 N- R8 x/ i" L& t% F+ a
2 K+ p/ R Y; J& ?! K) }7 V
2. 使用matplotlib.pyplot(plt)绘图: 例1:
9 L# M2 u- t; k: C5 n" L0 [- 1 Q. k! Q& G8 }) m$ y9 B. N6 e
- ; l, O `/ _2 y; s2 V
- & p2 Z( ?/ F% B# q3 R& [
- 4 }: H( x! k: d9 n
' D1 S% [+ n& N# Q9 Y4 q1 r. ]9 r2 b; C5 H- W2 l% P
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
5 `1 ]1 t1 n' p4 J1 @
. ]( E9 P( F. c3 m: ~5 Q$ X6 ~
/ o9 Q3 A! W, o3 ]& R4 x- 2 C7 |$ H- z. X2 n3 ~4 s
- u- _9 }; x0 y* A) ?$ k D+ R
* d9 m5 K% u/ _, H/ s! V- u, `1 V, k2 E7 g9 S
+ ]* K4 b- K; ^8 h7 ^
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()
% N. m ]# A4 y, V
图形保存方式: - . a4 h7 K1 g+ F& V& W
3 H# `6 h4 b& b+ J5 t- ^9 r7 u: s- / r6 x1 r1 g, p/ }
5 p+ `8 p. O0 f9 l
# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf') #保存为pdf格式的文件plt.savefig('coastlines.png') ##保存为png格式的图片
' n( k% }" e! F5 Z; d
; V4 [+ S9 X+ n) j4 `绘制时间序列图 例:以三角函数为例绘图 - ) p& T3 g8 L6 s
- & e2 I" U( M# W1 z
- + G. V: h a) K2 w) P! s8 T1 S T2 f/ Q" ?
0 z a$ I! z5 ^! @2 z: a' V; w- # S I( _. o0 l- h) n9 x
' R* d) i3 E; |( U6 O
6 d& x) D) Y) C- * k, I4 T7 [% U6 k5 ^
! S2 x2 L' e' c7 I' ~8 o+ u2 z) `- 4 c7 j: J5 Z4 {+ s
- ( ]* s0 n; U0 M! ~: `- S- E
- + ^. i8 f! `/ @2 M; C, ~$ {
- ) o! ?& \. X. t- s+ r9 ]
% s- Z" z9 ?3 b5 n- Z
% \5 e3 f5 h% i }" K/ J$ d
& \/ b# z- O6 k6 ?: o. W& _- e |4 r- # j& ~# v, D8 M+ E- b5 L& O
- ' V/ C6 V/ `5 L" F
- # l2 d- e1 x" k: q. A% _
- R- X; l5 f( Q+ w4 j* T
2 k! r7 L+ y6 P/ @$ W- h( y& A! h$ p
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()
7 E3 w6 ~5 ]5 A3 N6 E- g
?7 m% X0 v% P9 E9 W4 ]
2 l8 J: O! n+ e2 j/ a以某地1979-2019年平均气温为例绘制两个站点气温时间序列的子区域图: 数据内容如下:
- + z; _# S) G( i" y/ H- Y( Q; J+ w
- # e/ [6 H# N% a' p6 }
8 Q5 t* b8 P b/ k
! Z! i: C; M+ z) Z! W- N# m
1 N+ a" }# w# D0 r( C& U- / \$ t4 f* @$ `4 R
- 6 I/ k7 l0 u8 Z% N o' ^
- 9 j0 D5 z* N+ `
- % ?& ~! \8 F' s$ c
: m& t `2 J$ z9 I" c
% H1 @3 j6 f5 z: b7 d& ?
) X0 C6 n+ i8 r5 \2 n- ! l$ F' W9 u! e0 K5 g: b- c$ m& D" R
- + I/ s/ C) n2 S; C
Z- w# f/ n5 x% m- x- R
7 J% Q% @/ u4 n G+ }, R- 8 @( w" D8 Y: k5 o
" M) D) @3 u1 V% a9 C- o. s- , b# k% }, Z: f4 o4 ]1 |. o
3 o4 x6 X) ?# t* O1 }0 Y" j- ! c! H9 T9 y, k3 Q8 Q- C1 g
0 q7 H6 N& p; A
' K) D$ a* {( q4 j2 n
9 }1 O! v2 X( q* U- E
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()* U3 O3 g( m7 e) X
( Y8 Q& m3 e5 U8 h# ]' {( j
) c9 ?) }5 B8 L! e7 a% `使用matplotlib.pyplot(plt)进行绘图时,直接使用plt里的函数:使用面向对象的方法,先产生一个Axes对象,再对此对象进行操作,实现绘图。 |