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


    7 p4 L, j8 r; L+ i1 \3 f

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

: o! ?- m7 S, O# w) t4 \( P' \
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • & D3 h6 B* W7 q  x
  • , e9 x8 O+ C, m+ R  r& j
  • 6 G- `9 Z1 Y9 i9 v0 O
  • 9 o$ E5 i3 ]# w( ^
  • - J- x) v; Q2 u* t" e4 G" F0 ~
  • / H' r1 x" z; n5 R

  • . P% i9 T' J5 K6 b' ]+ X
  • 5 X, G! ?' O! d3 C

  • 7 Z% W) j& P3 J; G0 I
  • ) S* G9 n/ j1 H$ J( {1 X5 d

  • % [! K$ W5 X2 J

  • 6 p8 ?, v3 Y$ n$ x3 T( i
  • 8 P0 D$ K, @8 W& W0 ?& N' O/ R- q0 ~

  • . J/ o2 k, n$ b/ Z% v) s) m' G
  • 5 H$ I# O9 v* ?" q5 q
  • 1 V4 o2 N2 U& g& e* M1 F" S1 |! s: L

  • ( S+ W5 C! H- W! }
  • * {/ \, @' [+ ]+ M: {

  • 6 y1 h$ L, b6 l" v: Q4 ]! J# ^

  • " d6 y) q& J, _' H: q' R8 C1 u
  • ; ?* Y2 c9 z  A, F( p7 v0 ^
  • 8 I" \# ~  T1 x% S5 q- C

  • ! d6 M1 D& f! e0 b
  • ' c4 V' _5 E" c2 N+ D3 G: ~( ~

  • ' q. l7 R' @  U& O  m% c+ F! B$ R
    0 ~. T+ G4 q7 o. }

#绘制中国区域基本地图轮廓,包含省界#引库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")9 ~! g! Y5 V  W6 P1 H

, n0 `. l* D6 T: K2 g5 D

; W9 \* R% ~7 C7 b1 k2 H) i

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

# m& ~( m& H' O. X3 ^) u
  • % o! d% V2 k0 D& N6 f, h! \
  • - k: ?0 Y+ u& C" C- d8 i! Y; N
  • * w/ a! b4 m/ D

  • $ ~1 }9 p: ^! c+ l
  • 7 \% Z  N% x7 D6 }+ d, G

  • + L, I+ j( Z  @

  • 4 d, }- J7 F" Y2 n2 ?" ~
  • * ^) N' d3 n- v2 F

  • " }2 [+ r) S8 G2 Y

  • / `/ a8 P  e" ?8 E* j- o
  • . q: f; L4 _! F. [9 \: S
  • 3 y6 m  }0 H6 q2 G/ \

  • 5 L' p8 r" r# b& z$ m- ?

  • 9 E+ M/ a* V2 p# O9 F4 ]

  • & f7 W0 F8 g$ [" `# \

  • ; R8 R  I* J, A4 a4 m5 g
  • ! t8 N& S  n, _

  • & Y1 a4 c; L4 T
    ) n6 v/ A: L- z- p

#绘制中国地图,并标记各省会城市名#引库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 ^: v2 p3 L3 \1 n


7 n: }- l$ d0 _6 O. e7 _1 L. r7 k$ O% B5 z! [9 u4 H( I

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

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

f5c3384582002193c2c6c354a3d26729.png

: w4 b+ }+ ^& O

  • $ |" h. p9 J) c) P

  • 4 T0 V- ?" Z' @
  • ( ?3 z; o( i2 i, c/ _1 F* W
  • / Y/ d5 R# J4 H) k: f
  • % W8 w- o8 h  f; |: w/ T& \

  • 1 z2 b9 b9 @1 G4 q" _$ G
  • 4 Y- x# ]& k7 E: [
  • & P; h# m2 b& j
  • 1 @9 D5 Y" Y0 L& M5 I
  • # c$ Q. c! J( F* V, F
  • . A2 p  j$ @8 N5 h8 Y& T+ M, x
  • 2 U( O9 Q! g* y. ?" r" K5 A

  • / J/ A# O! O$ B0 [# m, `  h- z

  • , g9 C& ~/ F2 B# V9 n; M9 S6 D* S
  • - i& i( b3 I# `! V4 a

  • 7 S& w+ w5 y* }* i! U! F
  • 3 o# L* p# i; |
  • & }) b2 K: K, C# k3 `  t

  • " L# J7 D5 @4 R

  • % T& o3 \4 R: y3 Y, {# ]  [3 X

  • & I8 w4 m4 j4 ^3 Y; e6 `0 J. N9 k

  • / y6 i* K1 X0 T; f4 ]/ I

  • # n% u& S4 [% F( i

  • / i. r1 F' |" j# K8 `

  • ; o2 o% {$ P% ^: N' i# U

  • 1 ^* A5 p. o% w! c4 _3 J) d
  • 9 k2 R* M, ], B' ?2 u& S
  • ' L- {- f. G, ^6 h: Z# Y
  • " A( f1 q/ w: }3 W
  • 0 u) X8 K. x$ P7 P! Q! M: Q
  • 8 c  X# k* b+ H, L) Y( v4 d; h
  • 5 R' k% I" `8 M! T' m5 c) ?! H
  • 1 u. Z/ G* i; u( C9 y/ \7 }' W* N
  • % q6 ?7 z2 U, C/ O

  • 6 z/ }1 ]5 q6 t- q5 J$ G

  • / i; @; a+ N+ V& o- @' Z; W* G) E

  • + W4 D3 @8 P4 n* z; h" [

  • " X' @  \8 l* h+ \/ x5 T6 v* K
  • 3 t7 F: ]3 c3 a

  •   b1 S8 `) s: n  n% }1 H! G
  • , y# x9 S7 k. ]: t. \! \, ?
  • $ q& p" u( D  l& c  O
  • : @0 |% q) o" w1 U- s' ^. ?

  • & S! V1 a: p8 L6 i9 F. C+ z

  • " l5 B' x! v& \) }1 i* b

  • - B' q/ j9 B! L

  • - u5 L2 w  m+ J

  • 0 F" n* T" u# i0 t, i0 e

  • ' s; A& [7 i! u0 O# Y/ M

  • 4 B2 g5 N" B/ S( q7 k

  • 1 g6 o: w. h$ v! s! H+ M$ Z) s1 T$ t

##绘制有海岸线的中国地图#引库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()
" X- l" r/ Q7 o4 h


8 @0 B4 _/ n: g0 m' F
4 _+ z2 y1 Z2 O% g: Z0 u  b5 s

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

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

28af454b4567839d9c888c0e3809708f.png


+ E+ V# p! o' V, i4 I$ X( R

  • 4 m9 v8 K9 f5 O5 s$ z$ B
  •   t4 e7 I, S9 I/ G& t9 `9 B
  • % O9 R- ~( @5 b$ D8 ?% R* N' {% t; q
  • 9 T, N) V) t1 v- R, n) F4 I( w

  • . c1 m6 m+ Z0 \/ _& q! \7 Q: i

  • ; U, K% ~/ N) F$ s/ J4 Z0 l* |
  • $ ~; w$ X; D4 @7 U

  • 9 ?, q" g$ g) f( T0 @  P7 V0 o8 s
  • 4 K8 f4 Q' X4 Z% w! E* |' s; k

  • . _, Z: U) b  R" R: ?& }+ C* c
  • ( O7 ]+ ~' f( ~  W( {
  • 1 I$ L# m; V$ ^% }6 k* Q* p* J

  • * G2 w8 y$ F0 j& U5 i5 d. ?/ ]/ G
  • 8 p/ |) R1 n2 N5 {. O; t

  • ! _  `8 r& B* E1 ^$ l- D5 F

  • ) w: }; {' s8 w. v1 P
  • * q- u0 W0 o/ y  W' e) Q* G8 `

  • 8 S; h/ ]0 }$ i; X. u) d" j

  • 1 V# d0 {0 G1 @! j1 y  x3 @9 s+ B

  • # N* |' q: M: S, X; X' @  K. v0 N2 V

  • 1 z& @) l5 k, b4 i: C

  • 5 p6 z  t$ {& P7 k- R9 {$ i
  • : j# b/ I9 z" Q- ]3 P
  • : u3 m2 j  J; G6 R

  • 3 U9 ]) Z1 C  ^) P/ s& b

  •   H$ Q1 R+ F' P/ v& w
  • 9 ?9 Q# f0 Z: ?6 ]# n8 g) g

  •   H% G3 I/ s- U6 K9 N* H

  •   M. z- c5 ^  l; p1 f
  • ( \" o; q0 g  B4 g
  • , h) J. E3 K# M+ q: M" _3 N1 H* {

  • % R. W- ~9 q5 S4 a% e
  • $ w+ K7 b7 m* b" B1 h9 B2 O

  • ; m2 z+ e; t! ^1 P) Y7 C# }
  • . m9 l3 S- p1 u+ e- q7 ~( y' Q

  • 7 c$ L' ^7 O' ?
  • 4 n& d" N- U3 W3 X2 y0 H
  • $ i# V/ }7 z( W) i$ h% Y# g
  • 6 z; L6 H" n0 y* i

  • 6 ^! R+ l% F; |( e; |7 v
  • . f3 X* u% `! ]* g# m
    7 R8 N$ ?; f/ Q) P- _

#例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))
- n, `( g+ }! i( Q

0 q( F& g9 x9 J& V/ g  ^

) X$ s" C  P- n# C7 d+ ]
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

6 n9 ]) M  a' R8 c) {& l' a

  • 3 g  K5 f$ V9 i' c
  • 8 t) ]5 n1 ]4 r; e" y5 D

  •   x  _- c+ E( g" Q" J8 Q* ^

  • & B$ O% [* n+ R3 ^# f1 A1 S
  • " u' K# n, Q* A9 z
  • - B8 D9 h6 W3 P8 n1 c4 d
  • 3 P# t! g$ c! B! g$ M) R6 Q# J
  • ( [  h0 y6 y! Y) q* b% l

  • 5 S, H9 S) D0 _" E; e" o5 a$ F8 _. `
  • 5 P; k9 @  w2 M7 F2 x

  • * @$ k: ?0 N4 ~$ |
  • ! t1 n3 p, s8 r% ]9 K
  • 7 }7 j  q  m* u9 Q

  • % {) {4 i+ J( K. c

  • 1 w0 Z; _" q! e5 h' y: |4 Q

  • * e+ {$ b- R+ y: C5 I8 Q
  • $ ?* m! E  @4 Z2 g8 d

  • 9 A% N3 j% d2 M8 C3 e# h

  • 8 J5 T4 H' s5 m, g
  • 3 Y1 o; _- c: [( v( [! W$ `
  • % M" k8 x; t6 }/ J* H+ Z

  • ) J. i: Q' E: o8 H+ |5 K

  • ! {- O- m, d5 ]

  • # J9 i2 }: A7 _6 P2 W- D4 C

  • ! p( ~, ~. c* V# U& Y! V) e% u# Y
  • , l  N8 l& |. C0 k

  • : T& P1 }5 |% J( P

  • 3 H  f5 t# \; k$ j

  • 0 B2 s3 f2 ]+ b" M) c

  • / S0 Z" A) Z" e4 j5 W* \2 L. w
  • % w2 @  |* B, l6 Y
  • ' l; R, k" ]( K+ D8 `$ K, b

  • # Y2 t# F5 v2 H% ~3 T/ s+ \" w$ i
  • 6 t8 R2 H1 n' o- }

  • 4 J7 e* D# S# D6 G

  • 2 d6 v9 k0 t' i. m

  • # c; f1 k  u) `, i

  • 0 J* }* V- ~+ Y$ z

  • " w+ q( a- d  S% |/ ]7 e/ M9 U/ n4 r4 V' b& ?8 h

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))0 f0 K5 k0 y* u0 b5 T5 W6 I0 X! Z


. a# u& l! I) j3 M: Y
% y5 U2 c! G0 ~9 m3 a; k

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

# H$ Q' \; w; j  T  a

/ M8 J' O) s, }4 h5 l1 W% R8 L2 [# {" F$ R% g
回复

举报 使用道具

相关帖子

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