[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 Z5 t4 o5 l$ j

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


* V8 M/ E/ \5 z" M8 k                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • 7 K. j5 n% v: D+ }% K6 y3 n* b

  • 8 V. v  R9 k1 s( I" B9 u

  • + W# w$ X6 l6 J- v- F% U
  • 6 T4 W" K  p+ c5 i+ O* f" c

  • . u' u% g7 b2 A# X. w7 M5 n+ u

  • # X, T8 h- w5 V% v

  • ! K, Q' g; ]* b
  • 6 S* G# _5 I+ t. T; Y7 {

  • 5 F( x( m, O! y! R2 t/ m6 c9 t% A5 n% t+ z
  • " W  ~9 j; }% E! o  |5 B
  • 2 V, D) {2 w6 E, f$ R  o- Y* _

  •   t; [* {# H3 D6 w' g( t1 }: ~$ \
  • / g9 R$ `4 b$ ^1 q' W, t  C; h

  • 3 @: J' C% |& r* U6 @' D' ]  t1 _: o

  • 3 Y8 g: U- v2 Q+ y
  • / |* M* l# ?: y" c  T; ?) Z5 o
  • 3 }/ N/ a9 r1 W! X: n$ l

  • 7 c/ U. D8 r. W
  • % N$ b) c. M  c
  •   \% |7 v* K* ~, |  G2 T* P" X( b* b

  • - J8 h2 B" O! d% O/ J1 \

  • ( K3 M7 s0 Y& S/ T. ^
  • % X2 f0 {/ A' U( `

  • 6 ^8 @8 u" H4 B: A
  • , G1 X! G# W3 K! o) b* f$ ?

    " M9 n& T$ i5 @

#绘制中国区域基本地图轮廓,包含省界#引库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")
( Y0 j# J1 ]' L0 N( m# R, z6 }


6 S2 r  y1 y: p: E" v9 A. {% H! |! Y6 P/ S! J( Y

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

# ~3 h- u' B1 n' y! Z$ y

  • : |) N9 k, Z5 S' n- A
  • ; i$ e$ Q% }. h* i% |2 I
  • , @' u  g/ j5 b# ^2 r/ W6 Q- o

  • : o8 t% i: ^  |: K) i
  • 7 u1 Z5 X1 \" ~' \: w( p( R
  • 9 o2 {. a2 @8 R6 ^% _8 N2 A

  • 8 x' m' v/ ~7 r) B

  • , R" `: [8 \0 n6 G/ t& I6 T

  • ) ]* A0 ^- ]- P8 n( n
  • . ?+ Y( g, j; e! Y& \: N

  • " a7 P! S0 I  W0 l
  • # B# S; n/ B8 z- D' j: X: F5 |
  • . t* ]9 {, w* T6 p# \
  • " M/ r2 q2 c0 [/ ]' K

  • - Q2 y1 F8 b* y2 v# U7 p
  • ' C7 `$ q/ }3 Y% C* G* a5 E

  • 1 b. e) o% B5 U+ f& B

  • 7 C# c9 j! A3 R, K. |( W7 D
    " I5 I" m& a% \* R$ T

#绘制中国地图,并标记各省会城市名#引库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")
, E- g; N- D8 A# s5 ~& o

# S0 P: b. v/ K
, N1 D' g2 h1 j# `$ r* `8 m

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

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

f5c3384582002193c2c6c354a3d26729.png

8 }* B$ f- i/ y; g3 Z

  • - r8 x; ^+ a) G  N

  • ! w7 |9 ]* o- c- r; c7 R
  • - `! @/ n- t3 L4 ^
  • & ?, A+ T8 T1 H4 k4 w

  • 1 a) f. p* I# _" w6 c. i7 c5 _
  • # R1 p5 a& f0 N3 P
  •   X* C: i0 v3 [8 q0 A
  • ; \; ?5 q( N$ s( D. G
  • ! `- U* i. I7 h
  • ( t  C. l0 o! r1 h0 M( P7 q% O# i
  • 1 O) d' w1 M; M) g$ c3 H$ N; W

  • % E. q4 p/ r- w( \1 [. z, P
  • 4 s" H# T: c9 t* K9 _

  • , s% @3 f3 ~- h( l  L! F

  •   z! j- [0 O2 a3 k; ]
  • 5 }7 O, v) A7 C5 Y: T' ^3 W( R
  • 4 F5 }8 f; e9 y# _0 D9 E$ u0 W
  • 8 u8 S8 z: Y2 @

  •   B% U- `: l( M1 C* Z

  • ( Z: }- L/ ?6 z+ `0 K

  • : m0 I6 R: b3 `  I/ {

  • 8 o! u! \) j- \1 D2 _- n
  • # q- k1 o) ]0 G

  • 8 z: I: N2 `. J) q0 J: T
  • 3 {( G/ A6 a: a( a

  • ; |- {( A0 U+ t9 n. x1 Q
  • ' U0 c0 y" V% l' B- j
  • . }2 N/ b: b6 }4 w4 I% L
  • * Y) n9 @' J  o7 Z. N
  • / a4 w8 m' _- p7 ^
  • ( Z5 p, p7 [* F5 Y+ h1 `

  • 2 s  t) @5 a& P0 }4 H
  •   u* o! M' V, A1 q/ j; w9 U
  •   @4 I  m3 o$ h; j/ ~/ p, L: X3 z
  • 4 s* F) H+ P, {( j8 s

  • 5 E) v. {: F" m- m! ^+ `
  • : p! a3 G$ c6 A# t
  • 0 p4 `; g1 y% n7 M3 M$ k
  • 8 {( d+ q! L3 N+ Q

  • * ?; r' o9 z  k9 y' C

  • ) w+ M* N& C  v* n& _# G

  • ' V& A4 O- L, N

  • $ F4 t* ~( k( I+ I3 e- F
  • " l4 D" m0 N& X. A

  • 8 x. x7 a8 S% S& H3 `" U
  • . }; o: }/ t0 G2 G

  • - ~% z/ p" U8 d! H- l' {

  • # p/ s1 K. x7 L/ @: p
  • & t% ?/ Q3 A( f  l" K( E
  • : H; Z9 r  w/ U3 m! z5 S5 a* l

  • ! J; w6 u# t4 O. P4 U! W* K7 B/ {  `; n" X3 A1 [, y4 V

##绘制有海岸线的中国地图#引库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()- r& v" G- x2 X

& r4 S# l$ _! `) G# W0 H

# [% h6 V2 c( f

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

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

28af454b4567839d9c888c0e3809708f.png


7 u) j+ [8 u/ o9 N' r' ]  N

  • / |# [7 w2 \. X  Y! L- _; c

  • - m$ e4 W5 I8 Z+ S

  • % H- `) E6 y  h9 a+ O7 f

  • ' b! Y& l6 c  C1 S" Q! ]3 e
  • 6 Y) Z  H3 Q* ]; R
  • 1 b# R' F5 N9 x+ p6 b. W7 {. B

  • - k/ {, L, y7 i, X- }5 r' i( l
  • ! b0 o8 N2 b" ^! |

  • 4 W, F* x4 ^/ t. C

  • " w. y: S  |  L

  • ) Y# p) @5 n" ]. A1 r* k

  • / t  K. s, Y1 J& ?. i8 k" V; b, ^

  • 7 {, J6 i; X- J. c

  • 0 u/ O1 S6 D- T9 T6 y/ S1 j3 G
  •   t3 r9 l& |2 ]3 {0 }1 H  L

  • 6 P# R' c! h. `( c: @& j) N, j" O

  • 8 n( t: \% s5 S" k
  • " f3 S: i4 r$ x4 Q+ U0 k
  • $ L0 ]  t+ J1 F( w. x

  • & z) Q" l% ^; i5 e' ^. Z, h

  • # j* r; M% a( ]+ ]; l' I, f

  • ( ]1 K/ O- A1 S: {; S
  • 1 M# s/ L3 o; @6 V3 x/ Z

  • 8 \( Y7 e! S3 P
  • , d8 d# L, P8 G* r5 ]; c+ s

  • 6 k  }1 w  X! a( v5 a

  • : o4 t. J6 S" ^5 K
  • . O4 D0 U4 S  t. ^, @" Y" F

  • , |9 q9 B3 J$ G+ `

  • 8 O( v+ L. y* N3 z( o

  • " Q" f- U/ A  f4 l' k* H" }, }
  • ' g' [. Y/ o% Z  Z& h

  • ) P+ k- p: D6 v- {6 C  y

  • : M# c2 K% j2 m

  • 9 \$ K  t9 f/ y; F0 u! J

  • . W  t! m4 W. w# v
  • 9 a3 ^: y2 e, h  {

  • 8 @, y! a) V2 m8 u

  • & w" Q* r$ O$ s: I5 S1 ]6 u
  • , e8 P2 n+ `; {3 d  t

  • , r8 I# {$ P( v7 M5 ~) c
    # G5 x6 a& o/ r; i( s- o9 H

#例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)). J, W) O. M# f* k2 g/ S. |( ]


+ D. k0 {3 a6 U' m


  {! Y6 r( W# z& G: [- e- O( z                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


) R1 S! ^- T& C# P5 ~' a8 Y
  • ; }' @( I% \" E* H

  • 7 V/ Z& A# b+ T3 A
  • * g* d& ?0 K1 a" S% e& O0 N, p7 C( H

  •   i" S: z+ X2 u- q" a; G" E

  •   c0 k, I8 O6 A. J9 m
  • " h- t7 l0 B4 B( L) d# O0 D1 H" Q

  • 7 t, P. q. s5 V1 @3 p$ ?5 a7 X5 A
  • 8 x! a) g* x3 A: X
  • ; d9 a9 f$ C# i
  • 7 m4 ]* l& M3 M+ h; H" k
  • " I' R  W6 u# p+ \5 t" @! S5 ?

  • ) L+ q" g$ Z6 E% h. H
  • 6 {! g* j" E$ Y2 u

  • 4 k6 Q3 E6 P* f4 I/ O

  •   V! L: U  @8 @+ l& H; D9 t
  •   `! _6 D+ X5 S$ ?+ Y

  • $ k' C6 }6 Q7 i
  • * Z7 J/ K5 Z( L& O, K9 O) I
  • - \3 S2 w, s0 U7 R0 i
  • 1 \+ c, M& O9 l0 g! c+ J1 f6 |! ]

  • 3 a9 C1 R* Y  @" B- G, a+ @
  • 4 I, Q- o' N$ Y6 {- H% y3 P6 |

  • ' u. N& u, @6 e+ N

  • $ ~- |' S; S% l
  • : G* g9 o4 ^# H- v3 N' i; x+ L

  • - Q! E9 ~$ J* Q' ]6 f- t) I

  • 7 A# e2 E1 @, u# M, e+ f1 n7 B- c
  • ( Q' E+ _" E8 v9 S

  • $ l# L+ @. t3 G( H* S$ ~

  • 5 b% }  l2 `, Q% z; k
  • 1 i1 [) V: p( ?" c$ I/ }: ]" r* L5 n$ f

  • 0 j) V  y+ D, h) r8 T
  • * N4 L' M! \& ]8 N+ ~
  • ) K5 O+ e$ [0 f' H& b
  • * H, W5 K1 [: ?/ A. _# N3 u
  • 8 H. U. |# _5 v' d$ h

  • 7 o3 k- M5 K& i8 Q

  • " n+ P% p4 u5 ?; V2 K

  • 6 n' C: c; h! T+ U* f$ P8 o# J* c. s  f

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))/ Y4 w: x1 M' ]5 h+ h$ k

- e! G5 E% j  y- e9 T: f* x! D' q

7 K% S/ ~( O3 @" T- L% J$ L0 G

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


  }; g1 P; Y+ J& F( @" j6 v
! ^9 f6 q! B5 C3 f" n& V6 J$ ^" x
回复

举报 使用道具

相关帖子

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