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


    $ b& n1 L- ?9 ^* L. s5 R

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

1 \4 u' G: s6 ~5 b: q5 r
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • , c+ V$ G& F+ `" [
  • - U! w9 a/ M8 Z% O2 h( b  V

  • , g5 {; e: z; X1 \+ y" Z

  • . K- Y- C6 j) |$ f
  • - F. h; }8 i0 Q

  • * S0 g' |+ r& z0 \
  • 1 K  t4 b) D! u4 w5 i
  • 7 ]% L- w& H: G5 w. C
  • : B. G' P4 t+ a7 F& {& b

  • 8 n8 N* h4 a" [2 H

  • 8 Z( p4 X0 G! a# ]

  • * X2 l: x' ]5 \- J
  • , f$ d1 c/ R6 u* I* W5 n+ M( }

  • 8 z1 A' q1 @, o! K& z
  • / {) X. a" ]$ @9 h7 n3 A, \7 X* c! q
  •   K" M& l. D# P( W, e
  • . o: j" ]7 _. c' j2 c

  • 1 d2 T) _7 Y* b" \7 G: W* ^7 k% b" m
  •   v* O+ F& G5 c8 J
  • - z! e, `% }/ a" A; \/ j
  • / n6 |: J  s& C& r) B
  • , L3 d1 h6 t5 ?1 J7 X, ]4 B

  • + H% z6 Y0 f9 E+ U
  • : z$ K6 }+ K. ^7 L

  • , b; A$ c8 V# y: H  v& M
    # p/ ?9 Y2 z7 f; r# G6 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"); m" v" w/ i- Y* l/ g& `

% M& A" n& \; n9 m1 G1 h

8 f/ n8 o, {8 r

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


( E1 j* |5 f+ l' ]7 n4 c

  • ' v; A9 |% F9 h  L, V. G

  • . [/ y% z% K# h
  • / L' g* t  |. n$ _* b2 J: W4 o

  • " _7 |" `- J2 x4 Z) u( M" t# ^
  • 9 S0 p/ |! Q4 Y2 d7 j# M! [% W

  • 3 `( r3 @$ _8 M  ~, t( k6 N+ x, z
  • % J! O" ~2 ]: p0 U; ]

  • & _. g( o, ?# m, _+ V" Z

  • - c! v, ~! x# c

  • ' N5 e" @$ x' `
  • + p3 J" ~  y6 p2 x' g/ h! Y# O+ |: I

  • 0 O; R0 k. D: M$ u1 |( S: {

  • : B* }5 E" ]1 R; A

  • ! T- F* v7 `; u" i3 T3 [
  • 3 A( L+ n7 n1 w4 \( s
  • ; a" X& i6 V) e* j6 \% _  Y
  •   J5 ?! T8 ^9 i; c1 w
  • 0 L) M( ]) M$ W9 n6 S
    : L/ M4 W: ?* i8 w! b& n) V% C

#绘制中国地图,并标记各省会城市名#引库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")0 L! t' {; a! Z3 E0 P* F) m# R1 }

/ B4 e5 E3 b$ w" n+ X
" R5 W8 K3 x3 S

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

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

f5c3384582002193c2c6c354a3d26729.png

4 W! X2 ]; Q6 D/ u
  • % B* Z$ A% ~$ S+ {. u. y& o' P
  • 3 d! ?" j5 g( O- m

  • * h8 r1 F, k3 r! a7 B

  • - [8 g4 s, H3 @* m  A2 P& [- s
  • 9 j* g2 Q! p8 A! _

  • . Y4 N, i) R/ {
  • 1 D7 K& I% A: @( V. [3 P+ k8 c8 I) c

  • + e, G" }1 A1 O3 _( M( o/ W1 r
  • - x; \' m3 J' M% Y
  • : {1 t# l1 r$ p$ V% Z9 |$ {1 ]  N

  • 4 \2 G- V' z4 Z% X! H

  • " \3 Y& O- d. d
  • 9 [  W% I- W6 Z8 P4 o) o4 l

  • ' n" H$ B; a) @! r0 e
  • 1 n* t' i+ ]% D5 r/ n) q- L
  •   F8 V2 {" i6 Z9 ~7 ?' r" X+ s

  • ; {6 z* Q/ j) x3 v' G
  • 4 b8 Z8 p9 M5 ?
  • $ U. j0 ~/ o1 s0 L. }

  • ' f5 d4 O* b" u0 o! Z, I$ f: F' X
  • " p# _& L- J, b6 D/ {( d' T2 }

  • ( I8 L. P6 t% y  a/ k' K9 B
  • ( ]$ x$ Q  u$ H* c

  • : s" _+ t6 B7 r/ t! C" ^. p* B

  • . A6 R/ X3 Z, D- j3 Z
  • 1 D+ ~5 D! j7 `) l; f

  • ) B: w, ], C5 M1 p; }3 N! T

  • " F' D9 V: ~2 |) I
  • & e9 {+ R0 \1 p! l' \6 n0 B  l
  • & {! p; u/ S" T, ~4 g% R9 K
  • / Z* U, \& v. [- H8 d9 r9 `# A' V

  • ! l- E) W: j6 j( ^& W' w

  • % r2 V0 e: X( k  l$ K! H

  • , O: e$ B0 Z( C
  • , Q# U+ d3 ~, I2 u' W* x$ I
  • / w: n! \0 J- q& H0 G

  • 7 H6 g! q: k& X! s$ ?4 u
  • : ?5 |8 R0 D9 k: P

  • & V$ O; e; R. y2 h9 Q# p1 [
  • 4 i" @, I2 V$ Y' @
  • , @1 P" L. d" H5 T2 ^5 {

  •   P/ Z" `) _7 ?' B$ U

  • ! }' o0 G, {0 u1 E

  • / g' ]# n0 P# }2 G

  • & x% i7 B& \6 ?) d
  • + x: a( x. x3 ^) ?" J+ Z

  • 0 G* I5 @9 W/ w/ V/ r6 |% g

  • ( ?# b) D8 v0 X( l
  • ' x+ g; t3 Q( M, G; @

  • % x7 ^& H/ G7 j( X# V5 \4 J

  • ! s, F( O5 q8 g, ^* C. j3 Y4 G) ?8 a- g) @- `% ^

##绘制有海岸线的中国地图#引库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()0 a2 J2 s4 {* w

6 B- y/ E/ c  T
* t" ?, S" K" H: B$ g( {

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

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

28af454b4567839d9c888c0e3809708f.png


6 a# T3 o5 F/ H: D& V- E

  • ) V! T( J& K8 V

  • / {0 l& }6 F- t" _" w% f

  • 6 Z) R9 \1 m, E: _) o% h5 n

  • 9 J* E4 q1 c; ?+ [) ^( v! X/ y8 H! b

  • 6 ~0 X9 K1 \" o/ Y8 j
  • & f$ y! d# b+ `: m! f
  • * p: Y- Y2 S; }9 {$ m8 X
  •   U2 s! n) ~* S/ `, A# p
  • ; B) R% h+ |2 m) Z8 b. E6 v
  • ; W" T) `# t' z8 [
  • / y2 H( P4 O- t0 w( l3 e

  • " N% S9 c7 ]- e; [) T2 A) f1 T; E9 ?
  •   m! _+ h3 S" o: O
  • 3 c) {8 f4 N; m# Y( N( b; S

  • - n; w& p/ p, J0 }3 `

  • 9 e1 `* H" h5 y6 ?( {

  • 1 U# M# u- t/ {9 b1 Q4 C9 I  A4 k

  •   H" W( y1 O8 u$ o) q( }) S
  • " g: W. X: T- w7 H. i

  •   Y6 D$ y" }% n

  • # @, ~* i1 b7 w- \0 Y! A
  • ' x5 p% k: A( Y( ?! \9 s& |
  • # [. G6 n2 M# z

  • . Y- x! y. {0 K; i: {
  • ' X5 L% d% w& D0 b2 T8 f) }, R
  • % b. l' d4 U7 t9 j8 N
  • ! ^# |; E6 h2 L9 a8 p  v! s
  • 6 I2 _- r1 r2 i) T( Y

  • 5 p: o0 K  ]) y5 s# {
  • ' e- s7 h! R. e1 V9 h) [

  • 2 e0 R: _7 L" y9 w" {/ @, I; [
  • 0 B5 k$ y6 |1 L2 s, E0 G

  • + a1 i* q8 [$ n. b

  • ) K. t6 m, V4 n

  • 0 o: X. ]- T# V
  • 3 T/ ?* V  W8 A+ X" v$ O. U
  • * H' |5 H' @7 w1 o1 p1 W
  • + k; g& m- ?2 [5 L

  • ' |4 u5 e' p' ^6 O) ~2 _

  • ) p6 i, m  \6 g% f6 _

  • 1 [  H% v2 y* K0 u( j# h. A9 o" m4 R* V$ c' K- y+ B) P9 l3 Q4 m

#例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))
' A+ c/ {9 j* P2 k2 l


/ m9 Q2 l( p0 G, q, G/ v

, b3 V) W5 W6 A' N% z3 P( C
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


: f( T5 ~# j8 q- J9 \+ E8 s' N3 \
  • . t% u( |5 l0 t2 X
  • : E! _- o- k' ^& d' j
  • 1 N# L# @- N5 B* K

  • + T) G% C  `# u  C# p
  • % v1 P: ]: z0 p; [% d) U* D: L% a

  • ' k  Y2 ?3 X; F- C7 O$ `
  • 9 W  b; J& q5 h" M  p  r: G
  • ' m4 h1 h' d( y/ \2 e6 f! i1 N1 L

  • " M- z, y$ `# C; {' ]

  • + Z& x" n' P0 u; K

  • 5 x) ~, X3 m! {0 J. i
  • 4 d: z& R' |" ?. j& j
  • ) b3 N- a4 A* H- l4 V, z
  • " G6 K3 ?1 e4 H9 |. G6 @1 j* i4 r4 @
  • & X+ U3 [/ r/ c8 U7 G6 J
  • 8 L/ z6 C) z9 c

  • # K; ~! V! N, X% _, g# Y
  • 5 e! ~( Y3 D+ D6 Z3 P6 a, `; Y
  • 5 |8 r$ F9 C( r5 F; Y! \
  • % _1 R8 A. R- r3 S9 i& }
  • & M) D5 R: {' i' l4 j+ O

  • 0 B; I1 a7 R' @( t* \: J: K

  • . }2 w+ G0 x! _+ d

  • 3 g& o$ n6 C7 {6 \1 x

  • 4 A3 P$ N( x5 `) Y& b

  • ; T; ?2 Q% j/ a. @7 {* t

  • 5 P  A9 H. g# H9 \
  • ! Q& Y. e4 W8 E* F' b5 S2 ?9 J
  • 5 r% H- V$ @1 f2 F; q  f2 W

  • - E: c% g& W1 x4 Z2 i" b

  • 0 K3 y5 Q- T1 U- j* X+ q& ^

  • 7 M& d4 j9 K: _1 `1 i
  • ' _* c/ [4 u' p1 A& D

  • 3 D/ k6 w6 g- }& L0 n

  • ( ^" G0 w3 e; D' D
  • & h  m( I" H' a' P

  • * ?4 E6 s- {$ Z- V

  • 2 v5 l  j& A0 i) Q/ \+ A
  • , z6 M- g) T, E; o

    ( B& S7 R3 `& b3 Z# j

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))
7 N8 {% H9 a0 `$ [

7 e( M1 b: Z4 F
( H6 z( U9 V% r8 S8 b! `1 ^9 a3 [

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

) S8 \1 j1 S8 ]7 ^' N  k7 C

5 T  x% z  \7 k
回复

举报 使用道具

相关帖子

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