7 `- e* t5 j2 }* m0 L: x气象数据可视化主要依靠matplotlib做绘图,其他库包为辅助,包括数据处理的,地理信息处理的等等。 绘图主要有六步(“六部曲”)(不是绝对的方法,视具体情况使用): 引入库包:import matplotlib.pyplot as plt 设定画布:fig=plt.figure() 导入数据:之前已有介绍导入nc文件格式数据(【气候软件】Python读取气象数据 NetCDF文件(***.nc))和导入txt文本格式数据(【气候软件】Python2:读取TXT文本格式的数据)。 线图命令:plt.plot(x,y,lw=,ls=,c=,alpha=) 出图:plt.show() 存图:fig.savefig("···") 7 U! m- b9 s& t; y
只要按照以上六步,基本绘图没有问题!!! ) Z& S7 h/ a0 n$ K6 C' E
绘制中国区域地图 前面python9的文章(Python9:绘制中国/世界地图)关于中国区域地图的绘制方法除例3,主要使用的是pyecharts自带的地图,其中中国区域的地图有问题,所以不采用这种方法。下面根据其他博主大佬的文章(python绘图 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少))进行适当改进,并采用权威的国家标准地图比对无误的地图文件绘制中国区域地图。以一个具体实例完成: (1)正确的中国国界线,省界线,九段线的绘制; (2)全球地形图的添加; (3)中国标准地图文件的添加。
提前需要下载准备好一些必要文件: (1)正确的中国行政区划矢量文件; (2)全球地形图文件(从大佬提供的方式中获取的全球50m分辨率的tif图); 以上的文件可后台发送“中国全球地图文件”获取。
& B4 G- O% M/ z8 C3 M; @(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
7 _4 W# B8 Q" f0 W9 l; D- 2 A( l; [' f8 J2 M+ j' F6 F
- - B0 w2 z% K9 f; V1 |9 ^- _5 }; M
- 2 e. K* q- A8 t8 S1 U( k% K
' q6 A! W6 ]# q3 u0 H
- L$ B2 t2 F0 g+ P# U9 m
7 S+ m* S$ S! \' u$ x) `7 k& s- ' Y5 O% `" |4 K6 \( @; V
- + g; J: V9 V1 V# o6 C. C9 V) Q9 m
- ! o6 e0 o/ r N# X) ^9 W
- & S$ r! @7 H& L
/ ^( k6 \. E$ u& F2 }6 v
_5 R- \5 D* O. z- $ N$ P5 ~6 g) T$ L, K4 o9 t
- 7 c) u' ~* |7 q: M% M. ^4 j
+ ~. F T/ x9 A/ G1 ~, h( K' t' G- 6 O) |8 d/ O' \- C: o' ^- a
- % ~7 R8 ], r# g. O6 z6 ~
- ( x. i% s3 V4 R
8 u4 `/ A6 k- Y' w6 ^1 k- 9 i/ ^9 H1 x# t$ @; M) [. X
- 6 J6 U3 j% k& j9 n) y
) m) k/ e9 z7 s: P
1 D: ?- A1 e& _& }4 Z- ( a; u( q8 d% k$ B
& q: F# j8 x; A
6 k1 R( N4 E; b/ Y9 G7 [
7 d" F) y0 E) d9 c" J% q) _1 W- + F( |2 H6 i3 u* D( K) I( V/ i1 c
9 K; z$ K& z+ x. o: v- Z- & S, M8 b/ z+ a/ s6 N; d9 s6 ~+ C; Z
1 \" e4 X% e/ u+ W9 L( P- ) O3 W' h) p. x; j
/ O) `! a5 V# Q
$ |: F0 k$ Y7 C( Q* T( h
importnumpy asnpimportcartopy.crs asccrsimportcartopy.feature ascfeat ##添加地图其他地理信息所用fromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTER #添加经纬度所用fromcartopy.io.shapereader importReaderimportmatplotlib.pyplot aspltimportmatplotlib.ticker asmtickerimportwarningsfrommatplotlib.image importimreaddefcreate_map():extent = [70, 140, 0, 60]shp_path = r'./cn_shp\Province_9/'#可后台回复索取(这里很容易出现问题)# --创建画图空间proj = ccrs.PlateCarree() # 创建坐标系fig = plt.figure(figsize=(6, 8), dpi=350) # 创建页面ax = fig.subplots(1, 1, subplot_kw={'projection': proj}) # 创建子图# --设置地图属性reader = Reader(shp_path + 'Province_9.shp')provinces = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='green', facecolor='none')ax.add_feature(provinces, linewidth=0.6)ax.set_extent(extent, crs=proj)ax.set_title('China map', fontsize=5)# --增加高分辨率地形图(需自行下载) #可后台回复索取ax.imshow(imread('./NE1_50M_SR_W.tif'), origin='upper', transform=proj, extent=[-180, 180, -90, 90])returnaxif__name__ == '__main__':warnings.filterwarnings('ignore')ax = create_map()plt.show()$ M3 G. h+ j) I1 A4 o8 J
. r( Y6 E7 f: K. M& u" k, u) a
上篇文章(Python9:绘制中国/世界地图)的例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
0 W6 s1 c8 B& |- ) {* t7 @/ T2 V% f
8 W* X- {/ o5 U, O, J
\7 R G( Z4 R0 j% Y- , P8 p# f$ I+ u0 M8 i h! v$ p
3 p! n- v1 p- r& P$ z( ~- 6 i, A9 r. I, N. E
- ( d/ @$ v5 E' e- g3 Q1 w/ ~& m9 ~
( Z! d3 i" ?* {
1 Z1 C6 s2 v% Q8 l* H, u8 x; J- " k! g! b; x2 v
6 E- k& r5 } [- 3 x3 Y. W' {0 H, T: f& P# o
- ( B0 d. @* i& g: f
/ ]( }4 M- O& l
. N% e g, _) l- ; [1 t! [2 o# z2 T, t `
- / Y# s0 m' g! l2 ^% H! ?. {
. F/ N" o ]$ D' I; D: k- |- $ N1 Q0 N3 D" k! K" z) |) O
- % g& {5 |# C: j3 H
- $ X+ Q) w. K, U2 M3 C8 J" t5 A
- 8 M# w- r+ ~: ]( u
: R8 V6 G+ @' E- Q8 m. v _
4 \2 w6 i! U2 n: N% ]" Y* Y4 a7 M! \# ?: Y
( T. { e$ q8 j1 r! [8 r
3 D) b' P8 {+ R A5 I2 s+ l0 ?
3 C1 Q& O; W9 b% ~
0 H8 T9 o) y y# ]) z; |$ g- x
0 r4 G( d& C& ?- L2 d8 l
. o0 Y+ C$ q8 L8 I- , Y: M; L4 g7 y5 k
3 q4 W Z; p) a; c: R- ; l+ E* v V5 W) T+ X: G! o" F
2 m, A/ y1 i" T& i: w0 ?7 T3 e
+ ?0 j, r7 K' n9 q2 B( S' }- ( j+ p; Y' R! W7 E* V
- ( y \3 ?0 s1 k6 z+ K/ ~
7 [ {" }& ~; }. m# c- 9 p, t& ~$ g; ?0 }: Y1 j7 L9 \ {
- : _5 i0 Z& w4 k, \
" S! o" O3 D# Q
3 @1 e/ R) r$ J9 k5 i5 j- 6 J Q6 I8 B! F3 B% A! f3 D
- . y9 ?; f1 ?. d3 w* U
) a# s) T6 U; q, d: M; J
# N, |9 k3 ?3 L, D) ]1 W
4 m7 ?: @2 }) \" {' c+ E
# d$ p9 A* a3 m: S% q/ w
- ^+ k6 k- e9 m- D( B- h- O
2 A: ]" ]+ X+ c D. {5 I
6 `+ _) F+ Q) i. q. j! \, E* O' {5 }% ^/ y* L1 Y4 e2 A# E
##绘制有海岸线的中国地图#引库importpandas aspdimportnumpy asnpimportcartopy.crs asccrsimportcartopy.feature ascfeaturefromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTERimportcartopy.mpl.ticker asctickerimportcartopy.io.shapereader asshpreaderimportmatplotlib.pyplot asplt#数据data = pd.read_csv("meteo.txt", skiprows=1, sep='\s+', header=None, names=['station','lon','lat','tem', 'pre', 'sun']) print(data)#建立画布fig2 = plt.figure(figsize = (15,15))proj = ccrs.PlateCarree(central_longitude = 115) #设置一个圆柱投影坐标,中心经度115°Eleftlon, rightlon, lowerlat, upperlat = (70,140,15,55)#建立子区域#ax1 = fig.add_axes([left, bottom, width, height])f2_ax1 = fig2.add_axes([0.2, 0.2, 0.6, 0.6], projection = proj)#在画布的绝对坐标建立子图f2_ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=ccrs.PlateCarree())#海岸线,50m精度f2_ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))#以下6条语句是定义地理坐标标签格式f2_ax1.set_xticks(np.arange(leftlon,rightlon+10,10), crs=ccrs.PlateCarree())f2_ax1.set_yticks(np.arange(lowerlat,upperlat+10,10), crs=ccrs.PlateCarree())lon_formatter = cticker.LongitudeFormatter()lat_formatter = cticker.LatitudeFormatter()f2_ax1.xaxis.set_major_formatter(lon_formatter)f2_ax1.yaxis.set_major_formatter(lat_formatter)f2_ax1.set_title('Chinamap_coastline', loc='center', fontsize =15) #图标题名#读取shp文件china = shpreader.Reader('cn_province.shp').geometries()#绘制中国国界省界九段线等等f2_ax1.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black',zorder = 1)#添加南海,实际上就是新建一个子图覆盖在之前子图的右下角f2_ax2 = fig2.add_axes([0.8-0.6/7+0.01, 0.25, 0.08, 0.13], projection = proj)f2_ax2.set_extent([105, 125, 0, 25], crs=ccrs.PlateCarree())f2_ax2.add_feature(cfeature.COASTLINE.with_scale('50m'))china = shpreader.Reader('cn_province.shp').geometries()f2_ax2.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black',zorder = 1)#出图plt.show()* I3 ?1 m7 W" |
0 f+ k) }5 l: P9 Q4 q, m
# n( J7 _9 @( Z1 f0 E
颜色表:
9 w# _) ?& t: ^6 E+ B
8 g1 L. _( b" g
|