收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流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 c: f8 [# B( q: F

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


4 H$ M( Z& y; I0 z                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • + Z# Z/ g9 M7 F' h4 \# E" {7 ^
  • + [6 R1 l/ O) [  v$ `: o% M! N

  • & A% |2 K0 F' l

  • 3 p) Z' Z5 `. Z
  • ; L" ?* a" |: `# |8 n

  • / N% J$ y' I* F+ W8 x4 g, c2 K+ s
  • 0 U; f; [* J+ f  W7 k
  •   A' P1 k! t; I& I

  • 0 |6 }7 d$ ], G2 c; v) N: p

  • 0 D4 }2 z! U2 G, v5 @. k" ?' ~
  • ' `! I8 l* y4 M' s: j% W
  • & D$ N2 R/ w) e
  • , }5 h' D  S* s% w1 g0 ^5 j$ E
  • 9 m# U' x4 _" J2 P& G% ]# s- J
  • ; H, h2 ]! n6 k4 M8 {5 |
  • ; s- `' o, |- p

  • 9 [) g2 p, \0 V

  • / v, Q" W$ ^8 I" _4 o' ]" U
  • 2 [0 X5 M, N7 n, l! {7 v- D  ]
  • 8 i. v' k& M9 T1 P/ d
  • $ J) Z/ X3 o" z+ A# H, |9 z- @; M

  • / a8 r0 @2 ^! j( u

  • , C& }/ [) n: R& ]/ v% F& ?
  • 0 R& p! V' r, W. W

  • 4 @$ p# k! U, I" u
    + s+ y! O( i- q9 M$ I6 {5 m9 A

#绘制中国区域基本地图轮廓,包含省界#引库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")
; b1 R: }- s+ Q3 p8 c' w% K( G( b; d

5 R1 q8 T! c: ~4 m5 D4 z
/ x4 W' M) J4 ]% G

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


$ v! B; [/ Z% O. T6 Q2 k+ g0 J
  •   ]8 H7 W$ m: ]' ~/ k
  • 1 B, s/ t' B, l

  • + {; Z$ w, K0 ?3 M% i' K

  • ( s  g" G% M; \) b* [& e7 E

  • ( Q, c0 t) ~  ^" w
  • 4 E8 e8 ?% b# C; d
  • ( T3 @! K1 K% l+ B

  • 1 W3 J9 N2 b( ^1 g8 W  e
  • # l7 N" K6 S, l5 Z  o% B( X  F
  • $ n4 W' _: G8 E8 w( B& `8 R

  • ) h6 B0 `$ J0 c* i4 C( C

  • 5 B4 z) r) j* m/ v8 v

  •   s- p9 j3 t8 x  C

  • + [4 |" a* P5 i* Y  B' L
  • # c! r* R( f  z

  • * r! c$ p' Q; U0 z+ [
  • 1 v' U0 o- H  n5 N! K7 K: o( a

  • - I1 B7 L0 d1 P) y
    + q' e9 b7 r: d9 i5 z( 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")+ ~) Y- \# l# @0 q+ m8 l" V8 o

% e2 ^0 `. u0 v. c
- T# k; t1 v& u) l( c

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

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

f5c3384582002193c2c6c354a3d26729.png

1 V% N% @& G& _& I/ {, w3 ^  ~
  • & ?$ Y+ D+ o  `2 C

  • 4 e. V* {0 k; N+ S( `3 H

  • * Z( C- {1 C4 V% F6 i4 c
  • 8 d+ {, v; M% r; `) _
  • 0 B8 l  d* |- X
  • / C1 C+ M/ N3 x& H

  • ) k( J, M" T, |0 Q" r/ ]

  • / W* K1 n1 X- x

  • 9 L- T0 r3 Y% S- d/ w9 e
  • : ?( Z+ Z+ E5 I( f' p% ~

  • * G/ {2 F# C2 S5 s) H

  • % \% i& g8 o" [: b
  • ! C0 Y; ?2 \/ v& V) x# D
  •   ~& T8 w" ^. }- x" B
  • . h- k2 L5 y0 Z; j$ G: v
  • : I. F4 `7 F1 m- x$ }
  • 9 j  O3 U5 b' p" g' s3 f4 b' u+ n0 N

  • , O, f( v4 M  |/ M
  • 9 x& J* L' N. b& j1 P% W
  • 7 ?6 B: v! A# G# o$ T2 O

  • 1 o3 I9 x3 u8 C9 Z# A
  • 0 s7 Z/ R* O/ y" r8 u/ p# J0 e

  • ) h' P6 z' w2 H7 I3 J0 k; T
  •   x2 V/ Q) i7 D! `

  • ' m+ M( S' V9 R; k. T2 p! f# D+ s

  • 0 [- Q' H# s  o7 P# ^' v2 K

  • ! P7 Y9 a3 C7 t) g

  • ) O0 a; T4 R0 c" W- w2 X* T

  • + G9 g$ T1 Q1 D$ W% \" y7 z
  • 5 p% n7 t. c7 Y+ U3 T
  • % G4 x4 }- f5 q
  • / ?1 |, t7 L/ S+ }! x

  • ' B0 `  ?  M2 v; a$ r; T

  • " `" u) |. r4 v
  • 8 ?# s9 C0 R- ]$ W7 }
  • / c5 o* ~, Y" \/ Y# s% `- D
  • 9 M4 v4 l$ h2 W' H' y3 u

  •   z: E2 Y/ z* z2 K
  • 0 U. J: }, {  C* b' _
  • # Q) _+ [  q) [# S' f2 O& J

  • % w5 u0 `5 [; A6 r! U& g6 f

  • - T) D1 K1 s  ]- a3 e& o! Z5 |

  • 0 \6 m, y% ~  N1 [0 r2 T

  • ( e2 `4 C$ E/ V% H

  • 5 W/ a6 ?: z$ v0 {
  • ! Y& v/ z: A3 b& z) t4 }

  • 4 D7 f! S4 m" g; Y$ _" o

  • 8 ], ?; U2 z  c, P' N
  • ) I7 ?/ \3 |* o1 K5 P7 L8 ]

  • ' I8 G! G% C- i$ R& Z$ N# q, {

  • + p  P2 ?6 m: N* n8 A6 y5 z5 j. l

##绘制有海岸线的中国地图#引库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()
- G* B5 p" Y# `6 N5 R


. @' u' \4 `, h5 v3 H
( P8 I" [0 @1 W& u

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

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

28af454b4567839d9c888c0e3809708f.png


3 `9 N4 V" X: r) M& q
  • + x/ K( ]7 F9 O  i* k" c! I) `
  • # f; e# W. ~- ?6 l; ?

  • ( Y% {4 y& \7 V# S2 M
  • # `8 ^( e# W2 l1 P! W

  • 2 c0 u3 V8 d+ ]8 \
  • ) S5 D; K# a# R+ M: E, [" [

  • % G* H& i- I* q7 \* l/ c- r) I9 {, _

  • + M8 @% j/ j' c5 r% t
  • ; S' o: @  r: }/ E2 _8 w
  • : B  u+ G/ r3 m5 y  G5 R

  • 6 t/ W- A* T, z7 J
  • 0 ~7 ]) R, l# M
  • * T+ @" B' J2 v, J9 ?8 i% V; q

  • / \5 M0 J8 ~, F% R8 Q) P1 b
  • 8 F. C8 V8 ?$ ~& ^0 b* O# W0 _1 X

  • ! R; u5 u- g$ o) o
  • 1 f: v7 R5 [( i+ U3 z' }

  • 9 d1 \7 X. ^; J9 l
  • 5 s  i1 P8 \; b, g6 C. c, Z
  •   `% D2 f6 l( X1 e
  • 9 x- Z2 J/ j+ M: v2 T

  • ) u$ k7 h, `4 }0 G" ~

  • % c$ g- H; H: E! e( G
  • ; F7 N7 E" u1 ]; X! G7 ^! h

  • 6 Z7 h$ ]7 A: Y9 x, S, t5 T/ ]
  • . `! ]- j: ?( z7 D, k  f1 D- G

  • 9 K0 l; b  D5 T  f" }2 D

  • 5 J+ ]( I$ y: U6 U9 K& l3 t; R
  • * [4 p5 L/ o# X, C& b4 m  y0 a* |
  • ) F1 _9 ^7 l. x. _& @2 I' d

  • . @1 l( G# {3 ?% O& B; ~4 u5 W9 c# d, g
  • $ n# m0 N: e+ e7 f, Q* k
  • ) Q$ |- {# L% v( m

  • 4 U# d5 s* F! B5 }, T2 {& N

  • 8 K. Y  [# }% U% V& C/ ?7 Q$ u: J5 p

  • + B( H, G! x" c  m% D$ {/ l
  • 8 W9 D" {' T1 _4 i8 C

  • ; Q. \; T2 F4 `% F5 d$ c

  • / }5 Q3 |  L) T; l+ ?9 [

  • # x( \- w! ^/ J' L! k, l- V
  • ' A' z; c5 i: s" A4 O
    & D" n" o6 }  j( b" Y5 \

#例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))
- M# N) v2 j4 P6 p7 l" m


  E2 s* G/ r/ a7 F: I9 F8 T

+ l7 d0 L3 B6 @- M, v( b
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

4 ^" R! p' p1 @  Q% T8 X% R$ v& J0 ^
  • 4 o. N5 G* H; E+ ?& F9 `+ L

  •   |0 s$ G1 i3 I2 I* ]( A
  • . B1 Y) H9 ]. x9 J3 Z' B1 x
  • 3 z8 Q. ]1 H9 K
  • " ?/ l* f! Z! A: W7 F0 ?
  • : e6 ^8 m* S' p* Z$ R
  • 1 `, ?( m7 p  {6 U: \

  • % x, G& H% O$ {  Z7 z  ^

  • * Y5 E/ C. ^2 N1 O) y. t% d
  • # w- k5 n. H" k" l
  • 8 o) p( V& \* z7 c5 O( t9 g0 _4 d
  • & z& ~6 `# w# X0 \; Y; w5 F

  • " |1 j5 {" S- |- t2 W0 T1 s! f
  • " K1 g. }- S% L8 o4 s+ f# V

  • 8 N) p3 U. l9 `. N" [1 c6 {
  • , s  ?  t- B2 h4 X% G* l/ w

  • ( w! g) B# i2 ]. z2 c

  • 9 E( P* @9 }2 ]5 h' ^! t. g. ~
  • 1 R" ]  [& {5 J, B1 ?1 R- C- Y" r! y

  • ; r- T. ]- P" ]

  • / o* ^/ Q! w3 k
  •   j; P& P* A" s) q! Y$ Y/ [

  • / ]% z' j9 ^# R% C% \

  • ; ~' F- [. @& o
  • 1 f4 ^( K5 X, H8 o4 }; G, X
  • # a8 V! q' X0 a$ |4 H# M9 s% H1 d) M
  • , G+ [  ]4 h* a" S# t

  • & ?: p' J( Q/ k( c0 E+ t9 @/ V

  • 8 J* K9 }7 b, ]$ G! n& [

  • 7 |3 x! U: Z) c& i3 m4 X, q

  • 0 U0 c$ ~) N1 q' H. D; U

  • # y) ~4 l2 s) y/ K5 o# b

  • 8 O, Y# o. i2 p! Z3 o5 s% f8 y
  • / `: y* k/ H' C0 g  B  N! I
  • 7 e% {: ?! j5 B: D
  • ; b! n3 l) l3 \+ Z5 `- [5 v0 d

  • $ I. j$ F6 R8 Q& S6 b

  • . e' v. E4 O# o9 r( V+ w
  • ! _" s" T! I. m* X6 G4 y2 d
    3 B0 r9 [4 Q% `$ ^7 k# a

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))
; f- P# |* g  L" m


# R+ W5 n) h& Z! {0 }3 o$ I6 l5 z* S$ g

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

) U& v3 g# Q  s6 y/ T* \

9 H1 M5 A& \1 y& u8 D
回复

举报 使用道具

相关帖子

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