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

    + U+ @! s4 {6 m# n+ U5 |/ R8 a

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


% @  r8 C2 X" M) E6 J4 h                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • 1 h0 I3 e4 W' L# x- X- F/ b

  • 6 C! Q6 }, _) X

  • 3 h5 S& U: K  }4 d8 g6 q  M

  • % U' O9 T! @" @' n7 X5 {% }
  • ; T8 v. a& Z" S6 [
  • * y& x/ [2 D% U) W) r' t( [- r' \( l
  • : n/ }. W; x. H/ i2 i

  • - K# X" }, r' `3 ^. K

  • * F+ _3 {' i1 v
  • % v- h" D5 t. ]: K1 ^: v$ A/ }' \! Z

  • 3 K, Z- H4 F5 z& v

  • + J: u+ t  u. K
  • $ W% a' m' W# A7 ~

  • # a5 g* f( {, O+ J* l
  • # j1 w4 Z! V% Z0 N9 ~

  • 1 X! J$ z( V1 K* q8 l2 j

  • & V0 I: ^" \% ^6 V- O8 T  U, e
  • ' p; i" S0 V: f8 M- I; x
  • $ H* a4 E* ^4 E2 X$ `, G/ K

  • 3 \+ S+ l( `4 ^. [% H. l
  • $ q# Q9 M. j1 Z

  • 5 X$ \  _1 X' ]

  • 4 x% |( A( t+ e' i7 B
  • . ?# t! ~% `  F( u
  • 3 @7 @& K; [& }8 R) `9 }! E; Q
    + r: W) ]' H. X" ]

#绘制中国区域基本地图轮廓,包含省界#引库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")1 X- @3 P1 ?' c0 H* ?& P


4 K: k2 j; s# P1 T1 Y2 p+ j% ?8 l+ M: L! D) u) n% T$ E8 h& X1 |

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

) a  y! T  C: t5 n! r' _, x2 ]

  • 6 j8 _* J. _/ B3 o9 a; j

  • $ `7 u( w: i4 g4 T6 f4 z: m7 |7 t

  • $ q; G! {3 P6 e4 |
  • & O" a& Z/ A" }" ]8 @6 V5 @
  • + L. V3 N% j/ |2 N* F8 e: X* M
  • 4 j8 Z. _2 U/ \

  • / X" u2 _$ l) R6 h0 ?4 D& s5 h
  • $ p# e% x% A) u0 P, f

  • $ p0 V7 L: i! m: z

  • 9 u( L9 P7 G6 }* N; E

  •   A8 K- D6 p- x3 t: S  e# w" k

  • 8 |: Q- d0 e* I5 j1 ~& X( |  z

  • 8 Q  M. |, b& j
  • + W3 p7 ]& d+ \+ Y  n8 B+ l
  • ( @) L- L9 C1 m# v' p9 j
  • , V6 J8 }5 i7 `+ Q9 J" ^

  • 6 B! M9 O" L" b

  • # h/ U) v% l3 z+ }! s
    + ~( T  P* K: Q

#绘制中国地图,并标记各省会城市名#引库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")
% S) l' \( N' q* b2 [$ N/ L

% `* P' t6 }4 z

: A! p  b: A' c6 O, R

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

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

f5c3384582002193c2c6c354a3d26729.png

0 _. z3 m/ E  r+ x+ t- U
  • 0 C/ O  i3 Z( ]: j8 f
  • 7 ?9 b8 l: h) j# A

  • / G5 J, |% i6 v' {  _

  • ' I' B$ ]6 v; c  D
  • 6 \$ g! [9 U9 F6 Z4 \* L
  • $ B' D" ?7 t& S* d. B

  • ! J6 Z, ^: G  P6 _) u, C

  • . E- U1 k2 `2 {( o& `$ j6 b

  • & v' Y, s& B5 R

  • & H8 ~( P* M: K' f7 C
  • % [' Q; X3 \  J6 \1 U/ K  Z

  • ( I. _2 N. x9 X( K6 Z1 f/ P

  • 0 V5 F6 a8 `7 J- X. _2 ~, U- e  {6 D
  • 8 g$ Z, a4 W& i6 l0 r

  • ( q9 ~7 o& ?$ S+ E$ Y0 O/ Z$ c

  • * P+ c  n" u- R; a2 ]

  • " a1 Z6 s1 U# J, Q! x' Y
  • 9 H( T( w2 S$ A# N6 q) u

  • 9 L' D2 ~0 R" W1 T' M6 F; q( D. G3 M

  • . [3 X* V/ h" k  q, u

  • ( C. I. k8 S0 y% K5 u

  • / y/ M; G$ P7 g$ |" g4 q8 n

  • 9 Q( z/ K$ B4 z! D4 w  T

  • ! V" G% a- m( O

  • 6 y! T7 F, O' X/ @
  • + ?$ x! q+ f) t
  • * m; h1 M6 s. \  v$ o" `
  • - |( A  R1 B" Q3 M! P7 B

  • , ^. K$ Q" ^0 t7 u) m

  • 4 |' ^, Y' h' H0 c- A1 [0 G

  • " p$ m0 Q' E5 h. F5 ^

  • ! s1 _% ^* K% K: t, r4 V7 z1 u$ ^

  • 8 D3 j( d7 @; d# c$ S4 A
  • : ]  I! U% E- p' U, X6 T/ l; b

  • & j5 ~& n% M- P. q3 ?, q

  • / G3 l+ u1 |, Y  a
  • 7 m' L0 g5 h( {" I
  • - Y0 n  y( h5 q" C2 [2 X) W! Y' m
  • ) g) W' W1 j/ c- Y* U% N4 G

  • . R' m9 O: t3 {' Z# c% A3 @

  • : Y( E, T) T- t3 @  R; u
  • # ~  U) k. M, C. u' Z
  • . K/ o( }# L, t8 p
  • ( o* M- y8 ]9 }, s. F

  • $ J7 C4 P4 B0 E* d5 k4 p
  • 2 Q+ K  ]# E% C, }0 B
  • ( \/ Y" Q9 y" ^  c  @# K( a0 w

  • 0 G) }" a8 s3 z1 o' ~
  • ( q% I# d% ?" `. o

  • / x% E* `# Y. S. U. T8 e2 |7 u' Z

  • ! Z  }4 j* S# f+ S7 d7 S' ~* B2 m: W# L4 y' q! n2 \+ \, @

##绘制有海岸线的中国地图#引库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()
3 ^- V. f4 r1 J* t' O0 A% J7 t

" f% h3 e* z* Y5 L' I9 a6 {  H- c
( U) @8 j1 k6 a/ N

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

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

28af454b4567839d9c888c0e3809708f.png

4 d; |) Q5 K+ |6 ~" l
  • * L, u) x- v) h& c/ Z  w

  • ( H( _! d) n4 f+ I4 |" k+ L5 J

  • 5 D+ W* m3 [  E* }' }
  • # k4 w3 a+ k0 ?/ ~# Q( @
  • . v. Q* x# `- U6 N- g
  • ; `2 N  H9 F3 _$ g7 s3 s- P

  • ( W' l3 _7 G/ R4 d# v  y: Z; g9 K( l
  • ( p6 p* s2 L4 B! v6 ^7 X9 L
  • # ?$ r# f& q0 _' b# Y4 S# P

  • " Q* m+ U2 X4 \5 o( N5 U% k8 a/ K+ F

  • 0 ^- {8 M6 i1 D+ r
  • & Z# t6 J" b" \$ w% F! ~. `, m
  • 9 Q5 h! N& V/ V8 s0 |. f

  • + y) P; L. m/ N0 D/ M

  • 8 C0 q4 ?* s  @6 E

  • ; B3 m9 l) t% `6 ?" _9 p/ l

  • ( Y) t) `4 l4 x9 _4 V/ u

  • " j1 ?* i2 W1 n- `9 `( A: b+ H
  • / g: t9 P9 ?* q8 ]2 \7 w
  • ) l, z: U4 D3 x2 y! j9 R
  • 4 f. E. t+ d5 ~* j1 G  \! [

  • 8 T. D/ i; t( k

  • ! J" ?) z# v8 a2 V- N+ M
  • + R. b! |* ~2 F0 A
  • 4 E; c% X) j) F* G( X

  • 6 W, s# V* i: m# N, g/ d

  • 4 \) c1 j4 S1 l9 `. S

  • 0 W/ @0 V6 f+ \# x
  • ! a! I" ]# n1 ?$ Q# M% g4 M
  • ( a# ]9 m. D8 ~2 T% b

  •   c' \- p; ]- q  q! e( u& Z) T

  • " I( x4 m: y& v1 q" p2 ?
  • 0 S& u" E. h1 d/ ]0 \* ?

  • , |& P# M7 I* Z1 _3 Q* \) _6 r
  • ) U% t: @8 u4 f- T; n+ K* _

  • ' R) W( r) n8 f5 ~6 P
  • ' q% r* f$ ~" y1 \. I
  • 5 Y& g7 _9 _6 k/ i$ L/ n) `
  • - V0 P: o" \' I9 H  h
  • / ]7 h) `! v" u, }1 U

  • 8 V- f2 C0 Q5 u( i: r7 a; q& f% L
    ( D, g: e# s. q3 C

#例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))
8 z/ q) b8 b% r- a$ J+ S* o

1 V$ P( G; Z2 B3 U! w" `

7 {9 G# o9 H  y+ D, `
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

& |' Q6 O, D2 p- u
  • ' p4 Q- G# S3 f- i* H
  • ) M: U( R0 ~( d* H! p6 a

  • ! c' U- e$ H$ @$ X& ^' t
  • - X/ y0 o8 c5 m% T0 K3 _

  • - Q7 |5 g8 X, Q/ H3 L& f4 G

  • % |. A+ t' |5 c# }, i& x8 t/ @9 Q

  • + r0 n  R) M! P! g) Q
  • $ @- m$ ~2 K" }: e3 M

  • / z7 ~7 f& T0 r" O

  • ; }- H0 x" s" G9 w& T3 p6 {
  • % ~+ }. w. n' ]
  • 4 S& y. \+ x, O, B! G
  • 7 H* J( n0 G; S
  • $ E1 w; Q$ P8 f# p( c6 m* h
  • " E' W0 {  @+ |1 z9 F
  • ' j& O( t# H5 n3 i5 v% O9 o

  • ) W. I( _7 ^2 E4 \$ e

  • + s* r$ n, c  N, M& W; ]6 h8 P. f

  • % p' [$ b1 y+ o' [

  • & A; R0 c- x7 B6 R4 M1 G# {. z

  • / P* V/ j  o( v2 f' F8 Z

  • , ]& D& t2 ~5 m& b* {8 Z

  •   \! C& i/ H( v& i  Y
  • : g" I$ C& @( t/ d% H5 F

  • 5 {, n! v1 u  C2 }$ }, H

  • & u# n. P& W" T! v, U

  • : L; l' k1 t2 k  x# D9 r& x
  • 0 j2 m( {- g8 s* {. _1 D. I6 A' r
  • 6 T  w" x* @, m" u* i4 r' {# ?
  • 8 ^7 U! P7 o5 t" _! h! \

  • 2 [# P( V4 |; _! m! J5 W/ c8 \. G( b
  • ( E0 X; C5 a$ Y9 A9 X1 [7 |

  • ' T& e- d+ t' s

  • # k# L' z! I; W( ?
  • 2 f- k& E- [, s8 _' p

  • 6 ?& R' Q& v1 b0 g8 h

  • : x# M; G) o$ d( \% Y7 O7 j
  • ) u# @3 v. Z/ a( x
  • 3 \- b& W+ Q" T2 Z
    # @1 ^+ H4 e# t% {3 V% d9 r4 o

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))
6 k( D, v% {# O5 a1 |% @: {


+ E' _% i7 s4 r2 Q8 w- J7 t
/ R4 \. R9 p7 e5 S( o* H! }; \/ y; I  R

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


% @* _' u# P# Z+ C! P) E2 \2 _/ s9 T6 b8 R3 `7 R$ y3 ^
回复

举报 使用道具

相关帖子

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