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


    3 H- p& [' J% b2 U( |6 J" z

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


, o. Z  W0 d9 p' e( E1 a# }                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • 4 w% c$ E, A/ d. l" w1 h
  • 6 W& `4 B7 b0 r( \0 a: |( r! A
  • / M: |- e0 F2 ?9 ~, o
  • $ b- k' r- ^9 Y6 K
  • 2 ~" F6 e5 S- N" S

  • ' B( t" E7 s( h/ W; v' V
  •   q0 c  n5 u. F9 |9 W' [

  • * ~& k9 X# h1 r4 Y- j

  • $ B- y+ N. F6 ?! {9 s  B
  • 5 h  C0 I: G$ U, c
  • ) ~* q7 u9 K' h& K7 T0 ]

  • 4 |/ _5 ?9 s/ c
  • / D  U5 r7 K  z( F7 I* j% h

  • $ v7 I1 `1 S& T6 J

  • 8 c) {2 x1 {" i7 ]( y/ ~9 ~3 J

  • 6 M1 s% ]% s2 d4 M" j! `# q
  • 5 @) G# p/ o+ z- ]
  • & C% K+ u, y( ]0 O' ~. `
  • 1 ^0 N$ J! H5 t# D% h

  • 9 f5 c4 E1 a" O( z

  • ) s& R  w  f" K" T( w: U

  • 5 X/ J( H5 ~/ j5 X) j4 v0 g- q, D
  • 6 j4 |9 I7 K5 b4 o0 y( [
  • & q5 H& s+ l) h8 U1 a0 J. @
  • 2 {/ L# X3 {$ q! r2 [
    7 S! G. z9 E. R, F

#绘制中国区域基本地图轮廓,包含省界#引库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")% W: [  V: E/ q( G' o# ?


, l) C* T! M  E2 }! }2 a& C* X2 ]% f9 _" B

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


  }* S( r; Z: O+ a/ W* a

  • 8 A6 |: Y( z. n, r  Y* O, P
  • ( \- J0 m5 h, C: {1 r% r" d

  • 5 B* p1 l* z; a3 s9 m

  • ( S; S8 z1 a  P8 ?: x/ {

  • 8 v" V* e; W# p& J9 ]
  • 8 |. I0 ~# F+ j$ }% ]
  • * E! E$ a6 f/ ]* t2 K  V4 \

  • 5 T/ K; B0 D+ z& c
  • : B/ b3 F6 U5 `2 t. Z3 j0 i$ \7 Z

  • & _5 J8 r% W6 I" ?; o( K

  • 7 H( x7 ?' R2 c( I! L! ?0 Q1 m
  • - r4 }1 s3 E, \) T" G% ~* g$ F7 f6 @: j- Q

  • % H* q  H$ U  M* n; i5 \" f

  • 4 y8 ~& I; B& G. y: W, Q% ?

  • * O3 v; S! w+ [- }( [2 i
  • - y1 N! A' v7 C* x
  • 2 H1 d+ s- e/ S0 p8 X6 t

  • + |9 L$ w7 @! h7 j/ [6 R8 H* q. c' g4 r- E! o6 ]) X2 O

#绘制中国地图,并标记各省会城市名#引库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")
& D. R4 p) O+ a9 s


. c3 g- I; q% H* X6 ~4 \4 q  K( v3 J- a  c0 q, N- o

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

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

f5c3384582002193c2c6c354a3d26729.png

1 r9 z# c- X& g$ b' |0 T

  • + X! S, ]( m) b& \: l+ Y+ T& I1 N
  • + S4 f3 q+ I/ W5 {1 _
  • & U5 q9 s7 Q8 d9 M; t6 I
  • 3 T. u+ v3 y$ T' P2 s+ Q- u
  • ; X/ E3 |2 P) {. X8 [7 _# K$ E

  • " O6 A3 g# u* w  o3 p
  • & M. Z2 [1 ~( K* h5 T

  • 3 j" @9 |' u5 }: I
  • ( U, g' ]% w  D1 h* Z$ y' N

  • ) x$ D& g5 \& R4 O: O& `
  • 7 d0 Z6 ?7 P- \  T: R9 I( C% D; }
  • " z8 e% ~: L1 |9 s( F( e. J
  • " Y  R/ V* M3 M0 }( M4 S

  • 7 B- e' ^2 T! }# s4 _  [* K  V

  • ! x9 H7 |" [' l" c; g
  • 1 ?: D2 K' I! Q- @) F7 Q( L
  • + }( a# q, z6 ^# I$ Z& n. Z9 x

  • # R/ x" c" M1 n. D

  • * Q4 u7 g) I5 o
  • 2 {3 k- r/ s: H
  • : `+ b+ J; o  `1 r1 E2 _& }/ C  |9 D

  • 1 j3 G6 Y7 e0 R# `( ?

  • 4 ^7 a( H3 Z" p+ G

  • 5 v; M: K4 t7 [" H! i8 `2 [% R/ M

  • * I5 t! }; Q3 s2 t$ V

  • ! O7 |. O/ F! X  N

  • 7 g  }$ O7 H9 K" l  `0 L
  • $ P$ L  K, x6 a/ j% p  S
  • . x" i2 R0 ^+ j: h: O, T
  • $ w, f8 j- S8 L3 H7 B5 k- `

  • " A" c0 ~4 I' X, v3 n
  • 7 K7 w  h, N6 P2 W3 s- ]3 J! {! y
  • * N# p: V% P* s- x+ b
  • . X7 ?# i+ d9 K
  • ; I" ]) ~- r8 c9 [7 ~

  • 8 ?  _% s# Q# s" B& `1 ^

  • 1 `. H3 z/ M% A4 E1 F( t7 _
  • ; ~% ~/ U0 q' @
  • ; T  w! |3 j3 X3 l3 {

  • 3 P( o4 V3 i3 @/ r: A: e
  • % |/ u! j" Z4 u7 x" E

  • 5 a; J) [, \/ w; }

  • $ |% D6 ~5 g  l$ g, w4 P
  • / E+ [0 J) r+ P% [. W' i

  • ' E/ U. z7 U+ S( S! k/ i
  • 8 v! e: y! x2 p

  • 7 L& w4 F2 R5 Z, o
  • # y: Q4 O2 _8 f1 L

  • ) @' A# ~) }8 d3 j* q1 \

  • : n" o) K4 ?/ ?/ n8 s7 |. z8 b) ]

  • / D- I0 z; N$ O
    ( S" c% W  |: j* e# y5 r

##绘制有海岸线的中国地图#引库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()
  v- D- T. X+ i# l0 l& J2 i8 A% m; d


  q  L, \. G( Q  _& C. g
3 g2 w) \' f9 d3 ~

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

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

28af454b4567839d9c888c0e3809708f.png


3 d; c$ K/ M0 B( O2 w
  • 4 Y1 g2 A. r% z+ B9 j! j. ]

  • : y5 n1 ^! V4 r! r! i4 e* R

  • 8 l& f$ ^/ a* w. ~5 t

  • $ N- [; X( x% M% N6 m# U0 Q; w9 j
  • - \6 A- D! V  n- g5 C! |4 U6 k+ M2 F
  • 7 k. q9 ?) ?3 t
  • + y& U$ S# t5 {
  • 2 t5 C: f; s/ Q, L8 P7 w

  • 3 z+ v" W  y- F% d$ `2 U) l

  • 0 ?6 j3 B2 {5 ^2 |

  • % D8 ]0 Z4 T$ U8 B4 k9 }

  • 2 N' k: l: _# H
  •   L1 j; e0 d% Y

  • & M( M7 c/ p: C8 b( ~

  • * c/ v" [9 |6 Z/ d

  • ; M; R" M  w1 V7 e  {( {2 ?
  • 5 m9 r  i# n+ A' f5 l

  • 1 Z/ I  X5 o" I! W9 O; A, k

  • + w+ _5 o9 o  I/ y, `$ `1 j( {: {% h

  • , V3 T5 |. e+ T7 M+ a- O

  • 9 f  S0 L$ N! V7 d& w. s" \6 m) u8 a
  • " a. {6 i7 _: l6 T% s0 e4 k/ t
  • $ f) U, b1 G( W  U% Z( y" h8 s

  • , s" w0 P5 k* g

  • ( D- d+ I, `+ n; w. J/ k

  • 1 N1 [6 A( R! R3 V
  • * m- j0 h: Q4 M* W* E7 h9 p

  • + w/ ^6 s$ a# }; M. y% H! E
  • + s& T) i7 O+ b  }2 \) E

  • 9 N; x. I9 p* W; C4 i+ Q! q
  • ; A* P4 w8 a* Q/ V

  • " e" o; Q" y. d; j/ u

  • 1 ^+ X5 M+ U4 b, L5 M  s

  • ' U0 v9 y. A- c9 [% D
  • ' j, M- T" k) y6 ?
  • 9 v% g2 m! R2 _7 P5 S2 j
  • 3 o. @8 T% F/ E# J) U; g" Z, e

  • 4 g0 O* V9 k- e" V" X9 D

  • , P2 b* o3 [. K2 e( B

  • 2 e2 B4 K, `2 t8 M" O

  • ) k- d+ h. J- k, G( ^# t7 F* Z2 m9 H& e( 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))
9 }- ~4 H8 Z5 g! i2 f, Y


( j; g9 n0 q, _. m" @

( k( d% H9 z  P4 B; ^! }; I# M
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


' b, p% Z, j3 p3 M" e

  • . I/ X  F2 X( ]( E8 z# c3 c
  •   Q  n  T- u, c
  • + g6 e7 P6 v) I( P$ i, S# h

  • # h  q0 o; g7 k- j! L- W  U
  • / [+ m* J# |8 B

  • 9 w2 n$ @6 E- h( T% K+ i

  • : W- {# C0 o2 ~! d* Z
  • + ]2 m* I6 V1 ?8 l
  • 2 X$ F. K; r4 s! l+ [
  • 1 w% l9 r+ w7 ^* F8 f! c; `

  • ; [8 R" u9 S& c* m

  • ' ?6 ~" L+ U# m1 D- J# p! B
  • - c. {6 W6 }7 i7 U
  • ' ?6 @9 E7 o" o# m' j4 R
  • 5 s$ ~8 j4 M7 ]4 ^

  • 5 N2 ^; G, G8 M) t. j8 M; i# v  A

  • , A7 X- W( B6 s; k, C$ ~0 i& _

  • , g) e0 d* O. x$ ^' b9 E) o0 i
  • ( h4 o' L( X0 j2 L9 Q( D
  • ( T. X' Y+ M% Z3 ]0 v! h& ?

  • * A7 f; K5 F, }# u# a* O

  • " a5 w8 [8 U! N! {; l& ]

  • 8 u' V" O' I3 w( v- E* x6 M

  • 2 N4 e8 |* D2 w: G2 o/ v
  • / W5 U( x+ n: a! Q
  • ; q: j0 f1 D1 l: m+ X& G7 u$ f
  • " G/ h9 g$ J2 `: X/ a8 G
  • 2 U; e4 Z: E; N. D, W9 b" j/ x
  • 3 u. l& g8 u* H  S
  • 8 c- A* u7 W" d! y, U
  •   T# G( T( W8 N! V& G
  • & ^9 _9 Y" I1 }! h
  • 6 i5 |, H3 N3 U% F# y" N
  • $ [- M8 j2 j# p  @1 {. p! ?# g. m

  •   @+ }: X2 |8 t) {' w, N6 T. D

  • 7 T8 O: W; E! _! u

  • 5 k, `3 e5 W6 l

  • . `% _4 r9 r) A2 o. g2 @
  • ) S( {$ a* E  v7 b
    3 a3 H3 M+ Y# `+ H2 ]) C

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))! v5 c& q6 q) p6 n2 r) g

, L. [  S( I5 Y; e
; P' u2 B/ Q  \, V

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


' [0 W- A7 U+ `/ H1 i# V' S0 G
8 e$ E# Z4 `$ o) L2 a
回复

举报 使用道具

相关帖子

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