|
温馨提示 (1)本号分享的有关python的经验方法都是基于anaconda下载的库包(conda install 库包名 或 cmd 命令 pip install 库报名),以及使用anaconda里的spyder(python3.8)编辑和运行代码。 (2)所有的代码都是经过了spyder(python3.8)正常运行得出结果的,可以放心使用,也欢迎交流和讨论。 (3)使用的软件以及不同版本,都有可能会导致代码运用出现问题(不代表分享的代码有问题或是错误的。),关于不同版本运行本号分享的代码出现问题,请自行网上搜索解决办法解决。 (4)如有转载或分享请注明出处,尊重本号版权和辛劳,谢谢!如有侵权敬请联系删除。
1 t8 G1 S% V3 C" h( FCartopy是一个Python包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。Cartopy利用了强大的PROJ.4、NumPy和Shapely库,并在Matplotlib之上构建了一个编程接口,用于创建发布质量的地图。cartopy的主要特点是面向对象的投影定义,以及在投影之间转换点、线、向量、多边形和图像的能力。
: u" @0 w% T* z3 g/ a$ K绘制简单地图 Cartopy公开了一个接口,可以使用matplotlib轻松创建地图。创建基本地图非常简单,只需告诉Matplotlib使用特定的地图投影,然后在轴上添加一些海岸线: 1. 使用anaconda安装Cartopy库: - ! C! t+ W: N! a) B1 t; k
" U, S! s& s/ e3 n4 Q
conda install Cartopy; _% m& e3 y! b+ T9 _; Y
: Y) v7 _% |- ?0 H3 }& E/ F
6 d- _$ @9 p4 a
* Y0 S7 d9 c: I' {7 K2. 使用matplotlib.pyplot(plt)绘图: 例1:
% R4 j) k/ H( q: Q1 T- + W( W3 r+ ]. o/ |
- 7 Z! X1 g9 W. M+ y' p6 q
# ~, P+ Q2 w u5 v9 h7 N% E- & o' _# f+ X2 F4 a8 |
- 6 p/ e5 i( D P) ^! r1 Y0 U/ w
g5 K$ Z' P, @0 ~
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#一种投影ax = plt.axes(projection=ccrs.PlateCarree())ax.coastlines()plt.show()
r& y4 B3 V) w( H6 I7 w0 F
, a9 o9 Z6 J: T% ~8 i$ s. J
7 z$ s5 a- U! }: k% u: `6 Q- ( w" a/ h1 `1 {
8 I, b" l" n3 b! ^4 ?0 z7 L! R- ' s9 }, q. j- ~( T' ^
- $ @8 E- Y: B1 u3 l/ T% o2 U
K+ |3 ?# d% E* N
import cartopy.crs as ccrsimport matplotlib.pyplot as plt#换一种投影ax = plt.axes(projection=ccrs.Mollweide())ax.stock_img()plt.show()1 U$ w- S6 Z' ~. @% I
图形保存方式:
; u4 ] N# u t7 e- l7 ^& |- : b1 a) g; H) S7 n
- 0 z! Q2 u5 o2 I/ U; q
N- U1 [2 o8 J6 b
# Save the plot by calling plt.savefig() BEFORE plt.show()plt.savefig('coastlines.pdf') #保存为pdf格式的文件plt.savefig('coastlines.png') ##保存为png格式的图片- L) {: J* T+ o# P: @* _5 g
8 z, ]1 O7 L2 w& m+ U. [) z绘制时间序列图 例:以三角函数为例绘图
& k" A( o- C2 C- f- ( p3 o- {) g- T2 o8 o; B% |
- # O3 s" s# S- D: |/ |' v
- + |2 _, d5 y8 u% ?) l5 J. ?
- / F+ W3 S% X s% ?' W( m
- 8 }5 `; L8 ~3 n# ?5 H7 t1 V$ ~7 J
2 `$ I7 J) s, ?' Q8 E5 ]- ( E7 L( ^' s' p% H
- # l9 v- Z: M1 N
- " w; d K2 B5 M6 n I
- - g8 D' \# r3 i( ~9 a2 G" J k7 i5 Q
( G" `+ f# g1 u) Z k3 E" o- ' w4 y' U$ T- @9 |3 l
- 0 I9 r0 n S% r4 h5 N( j3 j
- & ?* l5 J2 ~! l+ `/ k4 {
+ P9 Q! \3 M, l
$ _4 I9 e a& m, `/ o: o9 F5 w
3 N0 _( g6 O8 b" y. _7 L
, p6 d, L/ Y6 m! |3 k
, [* y% P" P6 M6 Y
$ ?+ F/ ]; y1 P# m# B
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()
; ]' b, D3 B k% @: I2 ]! O' W% A
, y: @. D" F7 C( O, T0 ?$ H
, x4 o2 B% ^0 L7 L以某地1979-2019年平均气温为例绘制两个站点气温时间序列的子区域图: 数据内容如下:
" r% t1 f0 a. ]2 ~1 q
1 p# p( R) M# z6 F4 J, Z. g
5 y$ l6 X% {# X
6 E, l1 V9 g5 h% T0 \' T1 Q% l
& ~+ @8 |5 W- X& C9 A
x; B4 k( |6 E. R9 [
5 j: p( @: M: t) E% I4 o+ r- , l$ _( {" I8 v- t1 e: q
- 7 i$ x: G6 Y: ^
- 4 P- v# n+ @ N$ Q
7 S. J- s, O! l' x) d+ P6 U$ F, e
3 L: Q6 L. ^7 K a; B. i9 }% X- % N/ u) I2 G/ e* d2 y ~
$ h( G9 J$ ^- c/ `3 O1 a) D( t
+ ]' q4 H; i! x! G
0 u% M$ W: d, u
8 q5 T' S0 U: G
6 S* T6 Z3 _/ d# C- 7 ?* U; ?: o% s0 ?' c% q1 o8 C! W
" ~. v2 v; J7 G
% N, k! G6 P* w5 \+ ^
" I, Z' L/ C; Z. |- : L. n- ^, B6 f6 u) X4 b
5 n3 Q8 P5 p' @/ p
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()
; \, E) ]# N/ Z, {# |! W/ C
- ?& A( _4 n% z, A9 L6 y
8 j2 h l2 l) ^2 `& P; \
使用matplotlib.pyplot(plt)进行绘图时,直接使用plt里的函数:使用面向对象的方法,先产生一个Axes对象,再对此对象进行操作,实现绘图。 |