收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流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("···")


    / J7 h: N4 R6 M, @4 d7 {6 C$ S

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

' S* C! D" }9 q  Q
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • - x, ~. k7 s# Y5 C! F8 z
  • - j3 [3 B* ]3 f  S! @# A- J
  • - L9 X1 P2 y* `5 [4 g1 B
  • & y# c0 O" N- d8 c0 [

  • % W7 ?- `2 y: p: H# h* R
  • 3 O+ }1 f  f: K9 r; x  s/ s
  • . d$ Y4 \* n0 r& r* ^4 R
  • - L- k, P1 [+ h
  • . z/ s% }. a6 u0 A+ t. A. @

  •   t7 N5 r% ^, q" V/ {4 x$ X" a
  • ( M- U3 H& k6 G) s" ^

  • : t5 \9 Y: ?" j7 _! m

  • 8 q' x7 P6 T7 I1 w
  • 5 m: u' e2 g; r4 _' j" ?2 c
  • 0 h2 Z& L$ N: ^- @0 R
  • + B( n) j& w* A& m7 p
  •   d% q6 F% Z( z0 h1 P" c# \0 R4 b, q

  • 2 ?0 ^3 {( v1 K5 T+ [9 N

  • 8 E( n+ p5 r5 E2 |% w
  • $ D3 B) j" d( H& C

  • ) }6 A# Q. m/ c+ j& p) k& _

  • , O$ V) S0 Y& |- ?

  • 2 G) j% F: Q8 J9 ^. ^. \
  • 9 k5 H3 i8 F8 a4 }
  • . X+ `) z; c) O& m( E, x- g* v( t

    9 S6 g2 F3 q( P; q; M3 y3 A. D

#绘制中国区域基本地图轮廓,包含省界#引库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")
) c6 i# a( Z; u, `3 x' e

$ a8 ]; K; _$ ?  H# Y
# L" W% n; J7 T' F

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


: @( c" F- b+ H- j4 Q, r1 n' |9 C9 _

  • , B2 z! {( N* |/ F9 O

  • / t( k' l1 V6 T0 x

  • * {* b, D- ?) _
  • 6 w* `9 w$ A5 q+ G1 _' s) I" P
  • " M; ?3 ]# p5 }$ Y4 k: g2 Q

  • 0 _- `4 V! g6 J' Y* ]* L) w' |
  • 5 k. K0 L/ ]8 b6 t' D  n( W5 o

  • : Z$ W# d: x4 E" v4 u2 Y7 A# d

  • $ Q3 `; J( J- C+ j# y& N4 ]3 W

  • 9 P7 F. s9 l3 p/ R* N

  • # B( O( V$ t2 J

  •   s4 X! r) a7 ?- u, ~. P

  • * {. }7 \. s1 `/ a3 H# b& I

  • 5 t; ^( _  i: m/ U  P+ h

  • 5 y$ [5 l  j! s" D6 _, T

  • " a0 Q- i$ M3 R" e: }) O" y( B5 S
  • , J. z6 f0 h* L$ ?* w
  • 9 G) T3 c' K: u5 u" R6 i1 [9 ]
    / _4 c4 i2 H# ?3 M+ e/ j. R

#绘制中国地图,并标记各省会城市名#引库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")
5 }1 ~0 v" i9 C& {

; W$ C( w5 T" ?7 Q$ a- H* B

0 l: S( [* y1 w/ t7 c) s

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

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

f5c3384582002193c2c6c354a3d26729.png

$ t2 |* N8 K4 u2 P; G8 N+ E- ~

  • 5 ]; D1 U* K: u- X$ T1 l" F& {
  • 0 f0 p( ~+ n& R. p

  • 8 L! O1 @0 h: W
  • * L* Q+ e/ Z( a. f! Z
  • ; w% X% m# r" G! n
  • : {! h. L/ v( `
  • ( o* f- `0 n9 @
  • ) v, S$ I9 r, p4 e$ H" G

  • 1 C. |! l% Q" o: k1 a) q

  • ' |% _& n% ~1 a: Y

  • 0 n" o" W! D2 V8 D" s. }

  • - y- C5 T+ ?3 Z) D6 z' e1 Q# P/ c

  • ( l9 M5 k# [" F% C

  • + d' o0 y; C5 L6 m. I  y
  • ! ?8 G3 q5 i) e5 _, x( z
  • 8 B* t, E3 x1 P8 G( W
  • . x# ?! Q1 x4 u$ p
  • 5 v$ C( G: K' Q3 U

  • " r3 R* B2 ]# l5 c4 A1 F% }

  • + t1 S& t4 Y1 |9 C; N. A3 M/ \

  • + s% p& W' G( I( i* n% W& M1 a
  • 5 t! ?8 M' K2 D( R- b/ o
  • 5 M* n+ E$ p  i1 Q& x

  • $ N, w: [: Y! h

  • : D' S1 R) K6 U2 h6 _, B2 N- f% W

  • 1 V0 C/ V1 W% {$ i- ]

  • 4 @% m2 C4 a: B- t% p# Y, X2 ~2 d8 Y
  • 1 [# |. e0 B1 ~- `- z/ W6 Q

  • ' I" f8 Q6 F3 F3 P; C- W! S
  • & l4 e4 u7 {: e- d7 }7 ]6 @

  • ( U* N' c- W* g! N: B* {  f: z3 j

  • ) w6 |, _9 V! `9 T
  • $ {, L6 q) s0 u, y
  • # u% G1 }; C/ {) g! P. D
  •   }' p# e) F( I- X, n

  • / j9 G2 N! {5 P9 S! j$ P2 f# a6 c) V& ^
  • 1 s0 m# e& G0 V0 M
  • 6 B; k/ d7 M4 m# g/ S, c) p1 Y0 M
  • 7 A7 ?. t% F2 R) M: i

  • 9 S5 t1 s( p. R% {

  • & C8 E; X* Z9 U3 _4 g/ T

  • 7 \) S2 t' d; m% v
  • : i0 W( c8 C4 A- Y8 Y
  • ' A2 A1 O5 z" @5 k8 Z
  • + |9 ^5 G" c! s: R, v. [* L1 d
  • * x! \* g$ p, o: ]7 F
  • % ?: o: U6 K( c9 H- G+ w5 u  K: Z3 A/ z
  • 8 V0 a! ]0 F) T* F) E! S
  • 6 e$ C- v$ l, ?% P
  • 2 W; ~" b! I% N2 S2 z$ n* Q. N* a
  • , e5 a6 A/ f* P: w- Z

    5 ~# B$ t) y& G9 u

##绘制有海岸线的中国地图#引库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(); \. W/ N" n" O: @, _2 @


% }$ Z: p; l! Z8 W% J3 k% [- X2 `
" `! f' L3 J) r7 m. l0 p% \9 f

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

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

28af454b4567839d9c888c0e3809708f.png

/ a, P! o" s3 R# O

  • ! M" c0 D$ }1 @

  •   v2 T, p6 R: x8 V2 W- y

  •   S, |: e" \- `! o9 @% M( s0 Q

  • 2 u* |( E5 S3 }( P4 C* X/ X9 g

  • 4 @* V. L( E; Z9 G8 X3 f! [

  • 6 e# |; G- _( F4 \
  • % }# I' g" O! B; w* g2 C/ u
  • & c+ f" Q0 h: X( U( a

  • 8 V7 m4 A+ Q% S

  • # g$ Z8 ^# w4 [9 Z6 [3 K; e

  • , ?& }% F/ h* @6 ^/ Y6 ]/ [

  • % V& x  ~" m& L& s
  • " o( O/ c" c) p% P' [3 ~
  • 8 U, u/ o5 P; e% d$ k0 k
  • 8 C4 H3 ^5 I6 O

  • 5 O' f/ Z( C7 Z( n1 B. e, b
  • " I* z+ l, Q0 y
  • 3 u5 X+ \* {+ ^3 d  F; {9 I

  • # T7 v! A) }+ |5 x" \6 {% J

  • 1 @3 p& T$ r0 i0 k, T8 `
  • 9 {( w2 s! [) R: |5 v4 ~
  • ) Q: f2 B3 _7 V" W( w+ {4 O
  • * Q2 o' b# h6 D3 C8 H' m4 z0 o

  • ( K2 |4 x3 h8 ?1 D
  • ' \- d4 W4 t/ o5 J+ b( u
  • ! p8 ~% v) D7 n; e
  • & R$ ^% A5 b2 N+ t( P0 c
  • 6 f: I9 _  E8 d/ ]
  • ( _0 {% }/ w" ?8 {& ?" L

  • 1 c- ^& c  l  @3 l9 c

  • 1 J7 [! o' b2 r# _+ R8 D! o7 D3 k
  • 4 F% w. p! }& S, q* D, P
  • - j# A: h% j& P3 I6 R2 N& M
  • 0 h8 ~( K. |3 w( k" D/ m# ]* L4 }5 `: V
  • 0 \# d9 r# J; p3 l5 [

  • / }) @% {. r; J/ i" I

  • + V7 U( _# y- k9 C1 `- _9 F9 B
  •   e; M  s' ^, B8 H; p0 G

  • 8 f, F9 C$ q. W- U* ]- X

  • 5 P9 q; ]$ Z. z; ~$ R
  • ! G7 H5 S5 m! R+ \

    - P0 G/ w9 ?- r

#例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))
" t5 z5 T8 P6 C/ ?1 z


. F1 y  x0 T( y( j- Z8 \# ~% D


0 k4 \; E: R3 |* v                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


! d) o3 t" {4 D% i1 s( c

  • . c* n5 {& r' h  S& z' U

  • 5 u5 u% j* c0 P) q( d* Z( z
  • & t$ Y4 P0 s9 Z1 @. P

  • , [7 {3 c( ~, \4 {) s

  • & V3 J" A& O* X1 H: w4 h

  • 5 A* n* a& E0 F. t8 p  ^, y
  • , w3 I8 V2 n& n2 _! ?
  • ; q0 S' d$ F1 w5 M

  • # V; W2 i. `) ]2 A0 E$ o  h8 W
  • 6 y4 A8 H( R$ u; f7 S
  •   O) v: J: m" ~
  • ; j/ w+ V7 \* t( q
  • + r& T; _% H- N
  • # y: [! p/ _6 W
  • - R# l9 h1 u( t/ h. f
  • ) i/ _. R; a3 E5 e) h. G/ G4 n
  • 0 [" S$ q' c9 P% T7 M
  • + d0 Q0 K( R! i; _$ c2 A' ]

  • ) g5 J" w5 E  c/ s' Z5 Z+ q

  • * ]" |6 ]: {' U9 V/ ^  ]

  • ; F9 T6 z3 [5 j# `$ M- |1 L  h
  • / E" G& X9 h8 E+ {  h# j+ P4 l. |
  • 2 ~, y; h9 A. q. Z
  • ; E8 W! ]; s4 ?
  • ( R" u# C  w; }3 Z* U& E2 e# Z

  • 5 O& a/ K8 G1 N' m
  • 5 W) d1 |/ ]4 A- y7 ~2 W

  • $ ], Y6 O7 j0 h* E( P' ?

  • $ Y7 {! j# e6 h5 J$ m* j9 x1 B
  • % ^/ L+ m3 q5 r) [1 X( M

  • & M5 o- U) L. C
  • & I" T! D! j$ E% g8 D4 L( O
  • + c+ @) Q' T! E% K+ M, B
  • : T  S8 b) R3 B" b/ T

  • & J2 X3 Z2 k3 }/ I% r8 f

  • : S1 V1 B5 Q, o4 F- J2 |

  • ) F# Q0 O, e; Z1 i- X' M. p

  • & r/ N+ T3 L0 @3 B

  • 6 G6 @. w' \) O3 ^7 H1 j* m6 ?/ u+ H1 P- t: X: }3 r8 C0 S  [

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))
/ z, a, w8 \( O3 X, C- Y% g" `: S) `

+ Z  s- r2 ^& Q/ h8 [( o" o5 D

8 c$ s2 Z" ~+ K1 g1 A0 O

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

3 t7 i# R1 N- r; z. }3 y! t( ~

. W" f  A7 p6 [  L' H5 G
回复

举报 使用道具

相关帖子

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