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

    ! m. q" e) y" |* k" `* w

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


) y1 w. q5 t1 _4 S& s" D" m% R4 D                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • ) ^0 F' c) M0 L- B  K" n+ {1 F
  • 5 [0 P- f. ]. T( U) e8 a# Y
  • $ [2 O! G4 n8 P; u$ q) e3 h
  • 3 I; s$ T. o( Q

  • / P, Z1 z" W  |& a/ f

  • 8 B; n! O1 {  b3 i

  • 0 N$ f3 a% v, ~0 y
  • 4 {$ E- K1 s. e- ~. q

  • 0 X, c: D% c0 S1 l/ x+ D0 G

  • * g6 G+ Q" X5 k& B/ i0 i
  • 3 Z# z* `2 w) V) K& R

  • & a/ Q- Z, Z6 W  s

  • & ]0 x& b. D' l1 |* G1 s
  • ( Q4 G5 X% n: B

  • ) M4 V& C( P# W2 [, x  v: A/ E) n& R

  • + u. T. c4 w' |
  • 5 r# P" a* s  R

  • 8 y* p4 `0 h) M, N7 p7 v3 Y/ R
  • * L% u# B9 _2 n$ F
  • 7 o! g! o( d) z
  • & R+ h  x* N3 {
  • 8 \3 q3 ^) X! f. f4 Y) j4 \
  • ( N: j7 p0 }- z9 S+ j& n
  • % [: |/ \2 i% m  `2 j+ w

  • 7 h/ _. ]. ]3 h& v
    4 _5 {$ Z" C. }1 p1 L4 B# r+ R; q

#绘制中国区域基本地图轮廓,包含省界#引库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")3 h! h8 l! F% o/ x% M


: `9 j0 u" c* _! N' P8 E* e- u% C, s4 u5 h" p( ]

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

; U0 f( H+ I- O# @; X1 G* v
  • " m' V  Q" y) `/ S: d

  • ! @9 @8 z% f1 H! e9 X
  • 4 `  u! _9 N& S* z, y
  • + b, R# q" W7 _$ Q9 E0 X+ }

  • - ]8 S  G5 v# l1 e( F/ {; s% l
  • ) w1 d, W6 J2 s4 T3 M% R: b8 }
  • 6 P6 u* F7 V- n2 J

  • 3 ^9 A" p! a/ _) q8 d! F# u
  • 8 p" M4 O6 z' b1 G3 U) ]
  • ! z( A. a/ g% b, V
  • * `/ A3 M. h5 b# ~' X* S7 R
  • 1 u0 e4 E# F) r3 u" f9 e

  • / I% f$ }! A! u

  • 5 ]/ Q% u, Y. X8 P( ]
  • 5 @( L% j' l$ z0 R/ \
  • 2 x! A- j0 }0 D' d
  • 4 I. A+ T. _3 i5 Z, x1 G/ e

  • + \1 F3 d& @( W; `6 ?  Q# v0 y+ z. s6 p" S

#绘制中国地图,并标记各省会城市名#引库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"), p1 S6 B. @* T: F" [+ |


/ H) w- v/ S6 C3 S) ?' o  F" A1 O% J1 h- J

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

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

f5c3384582002193c2c6c354a3d26729.png


) Z2 X% ^  _" ~  A% b7 [  ?: g& a

  • 5 O4 \# u' }9 Y0 j- l  |! P& b
  • 8 E8 t1 a/ m( h9 G8 Y
  • : t, b, }# ?5 |* J3 X; z

  • & F& B. s1 ~0 i  N" Y3 r3 W' q

  • ' J' f% L* `! k- e6 e/ c
  • 2 a7 c* ]+ d: k# M! F. u7 ^
  • 6 [; H  `5 o) W& k

  • 4 N& s% {3 e, i" o) H: u  ?
  • 5 {# u. l2 a9 y  v: }

  • ; S/ q( B4 v6 P$ i
  • / @7 J. a# P! Y) B

  •   s2 u& ^# s7 w

  • ) |6 H; a6 k. t. u2 r

  • ! V- ?; G3 u' \% K! N
  • 7 N4 K( m% S. J6 c  I# t

  • ; X5 [# K8 T6 _( g& Q

  • : ^: K) ^& n( \4 ^& @+ G
  • % h/ f: n. }: j

  • 2 h3 v7 D4 r1 `

  • 9 t/ J7 V, l5 L. U
  • ) |8 g) J* \8 q+ w

  • - [; O7 H, \( u8 \$ k
  • * O" N4 e6 j- U" d8 e* U/ _

  • ) Y# g& K9 @! O% _6 p% P! t; p7 B

  • 5 @$ ^2 r% p4 D9 w- S* E( ^

  • + h4 ^  D8 E6 B, D) S
  • . ^* [4 e* ^) y1 E& f7 Q- {' g" S7 g* h

  • : W" Y( v# u/ O3 b, W
  • 4 D8 J- d9 C$ ~# C, d8 D. V

  • # M. r  O7 q+ k0 L7 ?, \
  • 5 O: y- O" V& T4 U) o7 R

  • 1 r* D' E! {, n& I  b4 X2 o  j( b6 V

  • 5 ?- R- U! ], ~( q: H
  • / }: C: x! C/ J, C2 X0 S" m
  • ' X$ {' L. U4 y, f1 i: Z

  • 1 u0 b- U! ]5 ?7 n6 p
  • 4 e0 g( k/ ^) a/ x# h5 ?) X8 n# c

  • 6 V4 i2 V* v9 j

  • 3 \! r+ T: E5 r6 X$ z- {; u, O- [. G
  • ) o' O& I3 N3 V7 k' ]3 P# a
  • 3 \  a! }8 e  R$ ~) J8 L
  • ) _; k: E6 [* A" k" r: S

  • / _" H- R# l8 h8 G* b9 d
  • , q% `3 p9 A+ ]8 q8 }0 y

  • ( y" b  ^( ?2 b6 \" m
  • - @3 N  ]- T* U( D4 n- r

  • 0 K2 v# W! u& s
  • 4 O; q: `2 G7 L  `& ]$ ]+ ?
  • ; t* I0 X+ o; Z. x9 V

  • ) p& G5 x. `* O
  • - k% Q* Z5 M7 M  S4 `7 i
    6 l8 ?! ]# Y2 K+ {; R' p

##绘制有海岸线的中国地图#引库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()
1 `; E, ~4 x, x3 o

  F; _; f" H' y! x) G# V6 q" Z

! r, Q: E1 D; @& R) e6 i% L& S6 e

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

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

28af454b4567839d9c888c0e3809708f.png

. \- r, J6 \9 g- V& E% E; z. y
  • # V- v, C# B7 c8 W' l
  • , S. G% V  J: j4 ^$ }- ]5 m

  • & g5 ]6 h1 ~: z& c5 \

  • ! K: a5 T5 m8 K* H

  • 9 A7 X9 I7 h3 ^
  • * k0 \. [( q! ~; K# ~, q

  • 4 N" c1 w! H+ v' S' @

  • " P8 T6 J: k3 u# {4 B4 _3 O4 P9 G/ |

  • ! f  ?) }2 Q) D3 {7 y" ~5 t

  •   g5 L) I5 F( {
  • ' u, p* x3 h; L4 O
  • 3 N1 B; Q! {! w" G8 Q0 i+ I7 I- L* o

  • 6 b9 W# q3 e1 R) e

  • ) ?5 m& G1 ]& @! g: `

  • 4 f( x( f9 o6 C: I# o" Q1 x9 O
  • 5 Q& p( ^" j8 M: [

  • / P8 b. N5 i; ], d; N6 l

  • ( T# C8 |4 v& J

  • 1 w/ [, }8 _7 P8 ~( X( |
  • 6 z1 T0 L- [  l- M
  • 3 g7 g/ @4 q) W0 t3 U

  • . ^% ^6 E3 T4 u7 Q+ y& b4 Q+ ?3 f

  • & a2 ?+ E: D, q/ b3 K- d

  •   V, }4 m0 M1 ?) s; e) f

  • * {, L* p  t# ?) g8 E, s

  • , @/ g% K+ d+ O8 M; ^

  • ( B$ L: w0 R: v1 o
  • ' @8 S; T/ H% G4 Q) u8 G8 v: c
  • 0 Y# m  Y1 Z3 T# n8 R
  • ) j- h: A% z4 Z
  • / P& k% }1 K3 q# m3 W

  • ! Z$ A( F, Y( c9 R+ t3 s
  • " l; G8 _1 a9 m& G: Z  ?  u0 F7 L

  • 4 Q" E7 }( {$ `( k; O( b* q; i
  • ) ?* B7 p* M* f% G, T2 a  O
  • 0 g7 ^# }& k$ w# i' e
  • ( s2 n+ b  e. ^0 E2 S' E
  • 5 p$ m7 J5 B% v- `% I# e

  •   K6 b1 Q; h, c
  • ( Z( w2 h8 S+ }9 ?4 ?7 d

  • 6 w* z! @  Z# X, k6 U! L# Y& M5 m% X) x

#例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))
; Y$ J$ p- _: a* y. j

! j* X7 ]6 X' _, l


" ^% C( N4 y" X: W- L) r                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


& p: x$ j6 A  N. ^8 t" \( o

  • ! Z1 i' Y7 c1 U, V7 |7 V
  • 2 G; `* ?# o6 N3 `5 i, t

  •   C$ n! T3 }4 T7 u5 H. |  t

  • 1 t2 P9 \, |. U! q9 ]  ]
  • % e1 I5 t$ i9 a( _* s7 v5 J* C

  • 8 n/ m6 W; ]* M; ~' F
  • + [7 ]$ A5 C3 [) M. g% P, |5 X

  • 1 d* s# c: M& T: r1 n) |

  • 4 z' P* W, u& z9 d* T$ B

  • ) r9 ?2 P5 n/ A* f7 ?' m) g! q: V. o
  • - X  ]3 x$ `" Q" ]

  • 4 h$ N8 p/ @  ]( p9 O
  • ; }7 L* E% m( \
  • 2 z; R0 o" S  y5 y5 s
  • 8 @5 Q* z2 C% q
  • ; ]3 @# h, v6 a& N8 f! r* w4 O
  • ! s% P4 f' w: R" k) V$ X3 v6 K

  • ) S/ o% C- [" n# F/ v* z" m
  • ! d2 l* N8 z3 P
  • 7 d+ E4 u" i$ I  u2 N- q

  • , F* W8 `6 h. S  ~! S: a
  • # t3 F7 u; C( {9 r4 o4 V

  • , h; c! H7 n: e- G  O0 r

  • - I$ T0 H( Y7 t! \" y; P

  • $ F& u* x3 I( J7 ]: y( i

  • ( }8 D: x' w+ K, }! `6 u. H9 y0 H

  • 6 B, U8 z: c0 r! u* E1 {
  • 6 w# ?" S# E% `4 C: U8 S0 Y" q

  • 0 r5 z+ a" R7 m! _( F. ~
  • , N. B) Q9 |6 C. W6 n* i. |

  • $ t3 V9 T) w5 t$ l+ T
  • : t" S0 j  ]) n
  • ; l1 C" t! W1 b& J

  • % }( l3 f9 e8 W" Y/ U* g

  • % D/ l2 B# Z' r; ?
  • $ M$ m& A/ y; i" M3 R: y5 A* N
  • , V  U2 T. [+ V0 f- t0 p: l
  • 5 z8 `  H9 k. u- J

  • $ L7 E$ Z+ `  E, L% g2 P! a! k6 s+ L
    1 G) }5 K4 A! E! k9 V5 e' X

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))4 J; ^0 t2 M: O9 M

5 U7 H! x; ~' W) h9 `' j
/ H. Y& l" c. V6 D0 G* w

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

$ {* U$ x& i' F' h: a; i8 D
* q+ n5 [! v" I0 z- I; e( E
回复

举报 使用道具

相关帖子

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