收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

[Python] 【气候软件】Python9:绘制中国/世界地图

[复制链接]

气象数据可视化主要依靠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("···")

    " x) N8 ^6 w% S7 ]8 L0 [% ~

只要按照以上六步,基本绘图没有问题!!!

2 U; b3 }7 ^- y( c1 v/ Y* K* P  l
                               
登录/注册后可看大图

绘制中国区域地图

下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解)

例1:绘制中国区域基本地图轮廓,包含省界

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

c26711da656503932f79c8379d2d0aef.png

  • - `# w1 a# l8 {5 ^) {( X1 V: ~

  • # {( `; k% _* h- j9 Q

  • " Q/ D' f% M1 P( d, u

  • ; q4 X1 ^: E/ c/ h
  • 8 d9 K, Z. u2 o: k

  • ' F: [! a' B" R% }7 E

  • 0 g1 i) V" T+ c3 H7 S- x
  •   i. O" y. D' }5 `0 p
  • 4 I& }2 n* n. ^' [- G, z
  • - c9 D  q- P7 @2 h1 s# Y$ ]$ m
  • 8 c$ `1 h0 K" A- E. P

  • 3 G0 Y' F. a: T

  • 8 h+ u3 q' {6 z8 Q: D

  • 1 h/ Y' G$ `- w. e( F/ \# c
  • % M1 c8 V6 a, F# J: w+ U+ h; o/ P4 V9 m
  • * Q5 q$ J$ e0 C& X1 r& n
  • # x: b! Z2 ^% @  N4 Y/ B

  • * G& h, V+ S4 J4 k# S6 t% E

  •   g2 I3 ?, r" d* W, N! i( l/ f
  • 4 ?" s3 H' d' E! v. e
  • " l% G( @* t3 m8 J4 j0 t7 c

  • ; F1 Z3 d, J% e0 }# Q6 Y& q1 \9 t
  • 1 A  v! ?  t) B) Y( u

  • 5 i6 B! O$ `# x% }: G

  • % M1 M. Y2 N7 P2 i  y- v1 D" X4 ^" ^, ?# H" s* @

#绘制中国区域基本地图轮廓,包含省界#引库frompyecharts.charts importGeofrompyecharts.render importmake_snapshotfromsnapshot_phantomjs importsnapshot  #下载库包snapshot-phantomjs(中间不是下划线,是短横线)# ->Geo 是函数注解,表示该函数返回值为Geo对象defgeo_effectscatter()-> Geo:# 以下为链式调用方法声明对象c = (Geo()# 添加底部地图.add_schema(maptype="china"))returnc# 生成对象c = geo_effectscatter()# 渲染地图c.render()# 生成图片make_snapshot(snapshot, c.render(), "map0.png")
) d2 b% }$ a% ^5 t& D


+ L% t- y0 j3 [8 k- j7 J4 I/ ]% u1 T4 N) l

例2:绘制中国区域基本地图轮廓,并标记各省会城市名

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

94f97fbff67b1f3a035f23ca0cb510a0.png


% ?0 Y; u% j1 w7 C
  • 1 y  f! U; `- G* ~+ U5 g4 {

  • ) s# b' z8 T8 [2 W; a

  • 9 k+ u4 ~3 z5 h( O$ J
  • / u/ d/ R5 {9 u
  • * U$ w* f% M; {9 D3 O
  • 0 h% I$ q3 t& `

  • " v+ g1 X4 ^( q  S2 U
  • 7 \+ {  X/ S7 ?1 F2 i7 r
  • ; n8 ~) T3 ?8 g9 @# x& g& ^- i
  • " j5 b/ M: A% q5 t: W( V- _
  • - j& ~  a' A0 l

  • 8 `" z' M5 t0 }  u1 W0 F" I

  • 6 P: ^. h3 u1 m! h$ I5 r. p4 x
  • 4 |7 u8 [0 T3 C) w' u: C0 r7 ^4 ?

  • 4 d' l7 Q7 F7 M6 J

  • 1 O9 B) x! B" i: F" @$ b5 _

  • $ C: n& v5 X. ~$ g: F4 Q
  • # g4 ~- c& [, G1 ^7 }
    ! Y. a) m+ I0 N1 [- ~) j$ l( D

#绘制中国地图,并标记各省会城市名#引库frompyecharts importoptions asoptsfrompyecharts.charts importMapfrompyecharts.faker importFakerfrompyecharts.render importmake_snapshotfromsnapshot_phantomjs importsnapshotc = (Map().add("中国基本地图", [list(z) forz inzip(Faker.provinces, Faker.values())], "china").set_global_opts(title_opts=opts.TitleOpts(title="Map-中国地图")).render("map_china.html"))# 生成图片make_snapshot(snapshot, c,  "map.png")3 ^5 i3 k- t6 ~5 v2 y8 `1 q; }# W$ N


1 @- c% v1 a* H8 Z5 C) V4 ~3 b; B# V9 y. M6 r8 g/ m# ^

例3:绘制中国区域地图,包含海岸线

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

f5c3384582002193c2c6c354a3d26729.png


  V- B- a" Q/ i0 D$ u" q4 M

  • + y# D; Z* g9 t5 s1 ]- R
  • - P) U" J: S2 h# I

  • 7 P. C; `/ V1 t& n0 i" n) j
  • 4 M8 n2 l0 W5 T3 K
  • # i% o% p8 M2 I" J$ n, Z0 C( K
  • ! n6 K5 P( W& M/ J3 \5 T" B

  • + @% t" K' ^7 v3 N  V0 t
  • # j- b# L1 Q* |+ v$ N5 l
  • * w, W8 O. s2 r8 ~
  •   o. u8 n, V! k! b3 Q% t
  • 5 a1 R: V1 T7 M) V

  • , A, O  l1 E) D! u" _- D

  • 3 [$ m# V4 P! n/ R; O

  • 3 e# I2 J6 R, |+ Y" v
  • , y4 {0 D' Q% B- B2 b8 ]

  • & b4 F+ S6 |$ M/ I0 p' T0 c
  • " `5 @! w. x8 f% S+ G8 p, ], x- Z

  •   u" O) ^- C6 o9 d
  • . w9 V' D2 o) M* M; Y- s" e; T

  • 1 L. H" Q$ q' H& o2 v3 T# ~: b6 f7 {

  • # ^* f8 Q/ ~' `

  • ) r5 R& z9 _, |: g" M

  • 0 D& u3 u' g+ W

  • 7 U$ f- O1 J9 v$ C! W& ]$ p

  • & L6 ]' z7 R! F( u& L
  • ; X$ ?2 T3 Y' ]3 x) C" ?

  • : B+ J& h# J& c: ?
  • . }" ~" O$ D: C4 \) ~
  • . u8 z$ S5 x+ ~, w, q; T
  • , X( P2 T; s8 A6 ^8 g

  • : {/ W5 S( y. x. @5 v3 R

  • % a" W9 W: X6 b7 }7 P6 t' j

  • " P6 Q" E( f1 w

  • " z1 U6 N* [; Q' Z- I0 z* O7 W' N
  • 0 g0 s: b# [5 D) v4 r! p2 ^* Q

  • - V# D* C  y6 B. P" H

  • 9 d* e5 q( r" b( G' _
  • 5 r" p+ H; _, \

  • 5 ^/ S& U# y; t/ i) Y- B2 m9 M
  • $ P! N* q% `/ O. Y0 i) P* x
  • . P/ W& S+ [$ q, N% ?& }" n

  • / C! }  S) t' u/ Y7 D7 q
  • 0 \8 |% g9 k" u( |- H& x

  • 3 q5 e, [  b0 A; B1 M% S
  • , d7 o5 z0 ~$ m" H1 J, L' d" ?+ K

  • & f( F/ N- Q4 j! y

  • 9 y- x9 z" ^7 T6 ~6 c2 q. M
  • - n& b; A, Y& G1 i

  • 6 b* p$ Z' A  K: V) E
  • 9 U# g+ T: ~$ [+ d+ l$ W
  • , ?1 g. i5 v* t; c( A3 p
    3 ]2 L% d! n  a( C0 J+ q" e& X

##绘制有海岸线的中国地图#引库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()& m2 C  V3 F: z# F' j: [


3 k2 O2 ?8 p1 F) M$ o  E% e( |. ?3 O& k4 Q0 |

例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

28af454b4567839d9c888c0e3809708f.png

3 Y4 t, M! z8 }6 m% |
  • % ]$ c8 j! W+ k; _7 r
  • 4 M2 q, H. V1 X2 m

  • , R5 K. h2 f* }! F3 B+ P1 Q" V) j4 ^. }
  • 6 z  q  M- x% ~; V
  • % E0 Z4 ~! \9 T1 ]

  • 1 I9 }1 Y* F0 S6 v3 v; D6 D

  • ) l) h$ D& S0 k) o. B: K! F$ _

  • 4 }& q" J4 w! S& Y( Z+ t' y# A

  • 8 a; v- h+ F; o
  • . ~9 @) `2 s" S0 q# L, C  t

  • ! C/ }* Q5 ]$ b
  • 0 M% e: d/ s3 _4 n7 \

  • ( F$ U" P0 \8 S, I
  • & G4 g9 V5 t/ g6 b* r  R4 V0 |; o

  • % N! g; I9 X; ~0 f# q' B, S

  • : g# k8 @" d' s: D
  • $ D# ]* I- v5 _$ ?
  • 4 L' `, i4 y# S& O* R+ r! g. P( L3 p1 y
  • 2 ~! x( W% n* R. g- V2 L& {
  •   B4 V  c- x" s* H3 c5 K
  • : F, e( R; {- W" Z, q

  • ' W9 ^3 f) q' s5 v5 K( s
  • 2 ?- `- E) \) Z. y( p: m
  • $ u+ a7 f2 e- x
  • 9 t. }) a4 d" k

  • $ T/ u; G! u' B  S! D1 L
  • # ~/ l/ |+ p1 s9 n6 q7 w
  • / F9 i4 g* e6 M
  • 8 R+ I7 z$ v$ J) e
  • ; P5 v" C, T$ C. Q1 m6 G1 K. u. C

  • 1 M& O, K( n! E$ N$ q8 h$ M- s$ Y
  • / e% K# o$ W  t% w
  • ! [5 S$ @& ]9 I- l4 ~' n0 [9 Y
  • 8 B5 K0 e* u, Y5 f4 q7 Q6 {

  • 1 O, t( [$ s7 y# A; G4 n; M
  • ( D9 O5 Q% L) |7 G$ f6 i

  • # n4 b! U' o% Q3 P1 U7 v

  • # f; K2 {$ d: |

  • ' Z% i6 s0 X8 P
  • : o( u. C) G% ?8 Q

  • 6 ?( J/ M. B% `; J' B8 i9 D7 ]) l, o6 @2 H7 V- }6 W

#例1:绘制粗糙的全球世界图#引库importnumpy asnpimportmatplotlib.pyplot aspltimportcartopy.crs asccrsimportcartopy.feature ascfeature  #添加地图其他地理信息所用fromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTER   ##添加经纬度所用importmatplotlib.ticker asmticker   ##添加经纬度所用#中文及负号处理 plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置-黑体plt.rcParams['axes.unicode_minus'] = False# 解决保存图像是负号'-'显示为方块的问题#画布fig = plt.figure(figsize=(4, 4), dpi=200)#子图proj = ccrs.PlateCarree()  #默认制图时,中心经线一般为本初子午线ax = fig.subplots(1, 1, subplot_kw={'projection': proj})   #一行一列子区域#默认海岸线ax.coastlines()#添加其他地理信息特征ax.add_feature(cfeature.LAND, color='limegreen')  ####添加陆地######ax.add_feature(cfeature.COASTLINE,lw=0.1)  #####添加海岸线#########ax.add_feature(cfeature.RIVERS,lw=0.25)  #####添加河流######ax.add_feature(cfeature.LAKES)  ######添加湖泊#####ax.add_feature(cfeature.OCEAN, color='skyblue')  ######添加海洋########ax.set_title('worldmap', loc='center', fontsize =15)  #图标题名extent=[-180,180,-90,90]##经纬度范围gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=0.2, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = False##关闭上侧坐标显示gl.ylabels_right = False##关闭右侧坐标显示gl.xformatter = LONGITUDE_FORMATTER ##坐标刻度转换为经纬度样式gl.yformatter = LATITUDE_FORMATTER gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1], 30))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3], 30))#更改刻度字体大小gl.xlabel_style={'size':3.5}gl.ylabel_style={'size':3.5}gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1]+10, 30))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3]+10, 30))
1 A  L& \- F# c2 B& ?- i

: ~  h$ S3 \) F+ }

: |& j4 J" s! B" e
                               
登录/注册后可看大图

例5:绘制世界区域地图,包含海岸线(中国移动至地图中心

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

2368bedc57620857d0a0289ff1b1ce2e.png

与例4不同的是只需要改动:

proj = ccrs.PlateCarree(central_longitude=130)  


2 T, I! s0 t+ @

  • 1 [# i1 q7 s$ T2 C- t% m
  • 9 I2 P5 G! ~. b4 f# Z; C
  • , D6 v% `! D- V
  • - X; S1 b8 L1 I) {, S+ W2 T; A& u
  • & f# u/ M% `1 C: w6 Z! n

  • # c2 u7 V. ^/ I
  • : d1 N+ w6 e  y6 C0 g# V/ \; x- Y
  •   J: K! r( y! s: v& k8 L

  • / w' A, R. c% Z9 _& o. U2 k

  • . @9 r7 l% B" ]/ a3 ~
  • 0 ~- f1 W" c! {' x3 T! Y

  • $ i9 [* s0 N7 [9 t0 h* F5 o
  • 9 p; O5 d$ Q, ^( h7 j/ {6 i
  • $ _+ v: @6 t' F. f+ Q/ H; c
  • . }- @  I& d; `1 a% P7 r) {7 e

  • * j0 n' F' t2 f! v3 k5 a/ e
  •   J) e2 j1 I8 @- d# `9 S

  • $ x9 T9 v' F, m8 y  }3 y9 [% I0 w1 u  B

  • 6 Q( H! V- c% l- m( }

  •   L- T+ c# ~9 ?1 g" i
  • % M6 p2 r6 p4 E

  • : ~1 T5 I3 v; c' S" o, J5 Q# ^

  • - i& d; I* t- v. d. t3 d/ h' i

  • 4 O$ {0 o* K3 X, F
  • 3 C: ~7 I& y# h3 }* s6 J& P6 @  \) H  [: t
  • % [- H! J, N8 K& g

  • : z% X8 s" _$ j- s- D/ X# _
  • ! o* r/ }+ }0 \! k8 p; X4 o

  • 1 R. `+ G4 P, {+ `( o, T9 l# S
  • ( E: R& J( L, M3 `1 N& b, c7 B+ F

  • ; Z; R) `3 m/ h6 n

  • 6 _& @' q# y* Z
  • 3 J% G$ Y( g6 L

  • 1 d( T1 m) N$ Y' e
  • ( K8 h( J: N& v# I5 e/ ^
  • $ X+ o$ a* A+ m  {% |  I

  • 9 p/ @5 `7 d/ _1 M

  • . W, h  Z7 p9 u& v3 k% b& {
  • : T; Z( A% W% [2 q  B4 X5 ]" U7 Z

    ( R4 ?2 v' V" h9 ]: P

importnumpy asnpimportmatplotlib.pyplot aspltimportcartopy.crs asccrsimportcartopy.feature ascfeature  #添加地图其他地理信息所用fromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTER   ##添加经纬度所用importmatplotlib.ticker asmticker   ##添加经纬度所用#中文及负号处理 plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置-黑体plt.rcParams['axes.unicode_minus'] = False# 解决保存图像是负号'-'显示为方块的问题#画布fig = plt.figure(figsize=(4, 4), dpi=200)#子图proj = ccrs.PlateCarree(central_longitude=130)  #中心经线为中国ax = fig.subplots(1, 1, subplot_kw={'projection': proj})   #一行一列子区域#默认海岸线ax.coastlines()#添加其他地理信息特征ax.add_feature(cfeature.LAND, color='limegreen')  ####添加陆地######ax.add_feature(cfeature.COASTLINE,lw=0.1)  #####添加海岸线#########ax.add_feature(cfeature.RIVERS,lw=0.25)  #####添加河流######ax.add_feature(cfeature.LAKES)  ######添加湖泊#####ax.add_feature(cfeature.OCEAN, color='skyblue')  ######添加海洋########ax.set_title('worldmap', loc='center', fontsize =15)  #图标题名extent=[-180,180,-90,90]##经纬度范围gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=0.2, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = False##关闭上侧坐标显示gl.ylabels_right = False##关闭右侧坐标显示gl.xformatter = LONGITUDE_FORMATTER ##坐标刻度转换为经纬度样式gl.yformatter = LATITUDE_FORMATTER gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1], 30))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3], 30))#更改刻度字体大小gl.xlabel_style={'size':3.5}gl.ylabel_style={'size':3.5}gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1]+10, 30))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3]+10, 30))
* p  E6 ~  ?# k* A" m5 k


" ~6 p2 ^/ Y3 g9 r1 T) i5 F1 t
; I- l( J# L* q5 m, X

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

" N. q  ?/ z- Z$ i  S7 w# [3 j

8 k+ k$ r- H4 T* L
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
有风
活跃在2022-10-29
快速回复 返回顶部 返回列表