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


    8 x. @3 [5 L/ ^2 I" f; ~( R3 c9 s

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


% ?7 n: U) V/ K1 `" B                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • , e9 ^2 U; |, @/ e% P( R2 K: h
  • 8 Z! f. Y$ L1 y  G) w/ D

  • : C7 e+ W7 i7 H( x. ~# w

  • ' r# E0 c6 c8 z
  • : N3 R% p' D2 N/ @' G# t: Y( K

  •   v" B/ V+ G( O: h0 g& u7 e8 O9 ?
  • " i2 H8 w0 Q' Q0 B4 t( b' _, }

  • , H' o" }4 ]% t
  • 1 d% g' i* P' D, l! [" F' U

  • . \0 K, q' K3 W* Z  }0 o

  • ! R# }; o* K, Z$ s( Z( |8 n9 C( k9 T

  • . d4 d& e$ Y* U3 D
  • ! G# ?7 x0 q( n* Q
  •   R3 r1 V5 u3 s/ r0 H

  • 6 B- `0 V; Y4 @" `3 t
  • " U* A: c  h3 ?8 c; v$ S
  • 9 X: u, ]' A* W3 j0 X. k
  • & L+ A; w& X. {: J  E: O

  • 2 @! k6 N+ e& `( X7 J

  • ( F( G- n. }2 ], v* g/ }

  • 3 T9 R$ A# o: W+ c* d) B( g4 x( N! }

  • * |3 G/ k  n% F# l7 n

  • 8 N5 q& B7 w( l8 R. P! S
  • + c% @5 y3 ]4 m" j; \1 C
  • 9 b4 q) b; s8 Y* N, ^8 y

    ! [. c/ @. L: X: g/ z6 x6 F; C3 ]# o7 \

#绘制中国区域基本地图轮廓,包含省界#引库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")0 J( }7 f2 E, u" S5 V' r

. V8 j9 i# _7 ]  i* [: U# O
% h2 l: B& s* k

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


5 ]8 z% y7 Q5 J$ q% f5 i
  • & ?" W- P4 Z' J8 L
  • " r4 W# Y; S3 ]

  • 6 Z9 z5 \& T* l; ?1 J

  • % t5 K" x5 r5 h! y% ^
  • ; |3 f6 a. E& A9 |$ o

  • 8 g- I. k' m  y' H! r  r. z

  • + U) o4 y. _4 z+ M6 @4 _9 i( X8 ~- ~
  • 3 X8 {3 }3 d. J
  • 8 o5 \, x& \3 e3 q2 p/ `) h
  • 5 c: |# z7 `5 }6 L# s* y1 c9 t0 X

  • ' A" }  `: O( G4 l

  • 4 B0 }% H4 _2 M" j. U6 x- v# s

  • 6 p% f8 N8 v( E: |% a, m: W3 D7 c; s
  • : l( e5 W  S8 `6 w- Z
  • 8 l0 V) q5 i3 M
  • $ G- E( z1 ~. ^2 i$ U' g

  • * G% h- P/ C" c' c- R
  • $ h2 n7 x/ O: e) r7 Q+ c

    7 n" O( G( Q4 h$ W5 n* Q& E0 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")
& m0 c; o! Y0 l

& `/ ^% s0 S3 s- k* @( h" ~3 F

7 a; a2 r0 `" @8 `6 j

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

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

f5c3384582002193c2c6c354a3d26729.png

0 s5 g) b; ]7 k, J' S3 S& k! g
  • 9 q% Y" u4 `9 c4 \5 `" Q# w6 z

  • ! Z4 C% Z9 T1 U. d8 S( U& [& E
  • % |7 t& q) e2 T  y0 ^5 o

  • " A) i, P  o+ r: Z6 X- e9 ^$ k
  • 8 T4 h) L, y1 F! ^  J0 K
  • 2 {" h& p. H. c) ]/ O
  • 1 m: m+ Q. w5 g8 q. R9 E

  • ) Y4 @. _, \" i/ K

  • ( Y; p5 S$ B  r! \  G5 Q
  • 7 ~6 Y9 i9 R9 P2 Q$ x9 Q' r
  • 4 l3 P: `' M% `  V' k5 J
  • * `' |% c0 _1 u% a
  • , m/ J+ j, D- O1 Y
  • / ]3 f% k% i& L2 c$ o9 k
  • : l- ?4 T2 _2 n* a7 m+ ^2 h
  • 9 P* `: W  `6 l9 i' [- s) n# W- G' X' ?

  • 3 E# C9 \; x7 P/ |7 o2 i
  • " v* |" Z' m/ @
  • + A6 `/ D8 ^6 Z4 H" R9 o0 v
  • 1 P0 i% o# N9 ]/ j3 L0 a+ k
  • 3 L) E( |. {# s' ]
  • ( J) x6 A/ @+ C2 \0 Y0 X$ a

  • " R' h/ R  F# |3 \

  • ' E6 i% _3 E' J  S4 L+ ?) P

  • : j2 a" u" @( V' l! e2 @4 b
  • 8 ~# B' Y/ ]& i

  • * ^" d4 J& A, a
  •   B/ }1 k6 U! l: _$ D. p; U3 Y
  • 1 g9 r, M  a. a9 I, s/ F

  • - c% ?1 ^. F0 d. L6 z- z

  •   k) E9 e4 I8 p0 I+ E

  • & A% c' \9 e* k, {$ {$ Y3 M

  • * ^  y* h3 `! a# T

  • # y% f8 r# h+ Q8 b1 t. [) J5 N

  • # Y9 I# h3 f! B) Y0 H# j1 y' H

  • 7 R& U# [" w$ x7 M' l# o  l
  • # Z% _- Q$ [; E! i' Y- O# Z

  • ( i9 o. s$ ^& o! I( \9 m; U

  • + j; \" U9 M0 k: U! s8 J' S  W

  • ; h/ l0 g0 T7 E  L* o

  • . J* t% G5 {; S( a* z

  • + I. r4 x5 D; l+ M! s
  • : p- X8 b* I2 S3 ~2 N
  • % r# \; {! @4 f% X

  • 2 K+ P! M+ Y% a& a% D1 i& x; j4 K& p
  • 9 t/ o1 D5 r* L( \% _4 G

  • % g' ]6 ?# Y0 R) F
  • 9 V0 |+ G5 U9 j
  • ; k; p% G$ @3 \3 @

  • % C6 g& x5 P- t; V, H$ ~6 I/ L3 m

  • ( C+ s4 t. v: D; `6 v$ K  {. t9 O/ H1 j) `6 F0 T3 R$ x% K

##绘制有海岸线的中国地图#引库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()
7 {  l; ]% O0 L% _( [+ |& r7 S9 F

8 \$ M1 T  e5 _/ V

" I# o5 z7 L, I$ l. S7 X/ ?

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

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

28af454b4567839d9c888c0e3809708f.png

( x/ ?3 D, [" R8 D3 L
  • 9 N  A! g( R5 l; A6 x: \: K
  • 3 i; A4 s" C) H2 @# I- g  ]3 Q
  • 8 t3 e% l4 S: A9 ~, w
  • 2 m9 A: W" K. @
  • 4 |0 @9 K5 U1 z1 E6 n  l
  •   g  W" G" i& A$ h; f' q

  • " h  z% t1 r7 W4 B0 O
  • 5 M: H5 V5 z4 H

  • 8 B" j3 i/ Q7 m0 i
  • $ F8 V4 p( h- c% W4 ^  l# O
  • ' ], i, |# H; g7 t/ U& h, b5 @
  • 7 K3 f, S* ]  v0 f" X1 N

  • " X. z! p$ b1 z* h6 e

  • 2 A5 J: `1 R; r) t9 P0 z
  • 3 ?5 k# I) j( h6 w

  • : {! d# b* |7 r
  • . `( I7 K9 I/ {% F

  • ) `# X* A6 y7 Y
  • 0 K7 b8 b( T4 \' a- @" {8 {* }, a  }
  • 1 Z0 Q: B9 w( S0 I; Q
  • ; P: E' M2 D+ C, ~  U) q& a
  • ( {7 l2 F; H4 |

  • : X0 q/ S- L/ f% r* S" H1 c5 U

  • 1 Y! x; d, V* O& y% o
  •   z) L; v: ?  l: K3 s3 ~, T5 ]" U; X

  • 4 P& s  _$ P1 W4 ?
  • + m4 [$ A# {3 G8 F, O: ~/ P# s

  • 3 a  N& `6 d7 U% [( \* G
  • ( G9 K$ [# }- x6 k
  • & w8 i: N" h4 p) b$ A& n( k5 N2 ]7 [

  • 7 k4 s" K; U) S; C1 p/ c2 n

  • % I2 ?, u5 v% q8 \

  • 0 N+ C* I6 b% C2 S* c5 M
  • " U) ^- x* S* w/ ?2 f  n) O7 n/ p

  • 2 c# }# a  N; Q1 K$ q/ a0 @
  • # B% `+ v. H$ ?

  • 6 y3 Q( y, O8 O. N
  • 7 M8 Q7 b1 a0 x+ P2 L; }( ?

  • 6 b, C& c6 I) j* j& y" P8 y

  • 2 z' s6 v: K) V/ y. B! ]
  • 1 }5 K- d0 H' {3 M! d. r

    : I# c4 J: j! H7 A+ g# u  o$ K

#例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))1 G, ^% l% l8 z! r. o3 L

$ D) m: ~, z$ P


. ?$ p# k& |' m9 F( ?4 O                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

2 E8 _  q1 o+ U* p# O
  • 5 O$ L" u3 c8 J0 k' I# q+ e
  • / s, x2 Q1 o1 ~
  • ( l/ v' E3 t9 _

  • + L( Z  q) b+ |" e$ P- q" A
  • 9 i% Z, D, K. \& Z
  • $ f3 D, \# L2 i. u6 K

  • & T7 ?0 g$ \1 S' e! J3 @

  • " T1 J0 `$ t* Y! p. y9 J/ F5 r+ [3 M% E
  • ) p) |2 n4 }( y, c# b0 B% W

  • ( F5 P! j- t, i2 p0 s" {+ q$ l+ W

  • " }$ D8 @; [& b3 _4 K! a2 @( J
  • 4 t; |$ T: a$ v# n& z
  • % J  I+ n% ^# c

  • ! }: b, l, n8 E0 w1 O- }3 B2 q

  • 5 D9 x9 r$ f1 ]$ F8 A
  • & Y. Z  K$ x& s: j
  • * I+ y) M# m% b/ Q5 P" S) D

  • 1 N/ d0 O6 L; _, \- d6 M
  • 7 W$ q/ e5 O: G) |" `; g; Z2 r5 j

  • ' R" ?) U! Z. k( ^: d

  • & M: Y! G- R8 f6 X2 q+ X- a

  • 6 L! h7 s/ U# E7 }% U
  • " l- Z6 |0 r5 ?3 R$ e

  • : k" G4 r) P* Z1 Z, L: z- |/ f& y

  • * H; S3 R7 _$ q) v0 G

  • , g8 n* k1 Y& U& \7 u4 l) Q
  • " D  z+ r1 z1 T$ {; A5 y3 @5 C

  • ( w4 e: g0 G7 i9 ^2 d
  • & c) K  K7 o  ^( k* \. _5 P
  • & {$ U7 r, ]) K4 ]& V
  • 1 i: P# E3 J, _# }% U
  • ) P' [4 ^6 U4 Y( R6 e' P' ?. O
  • ! C' `$ C, [) u' ^4 X: N9 q
  • / P( m' t4 N( ]' ?$ `$ ^# q( {

  • ' ^+ n0 y8 g; j$ a0 h4 W

  • 3 c0 q6 z9 p) `

  • # A' _" u. z! l* c" \
  • 7 C* i+ z$ _# k! n$ H9 G
  •   |0 \* M% y5 z- E( Z

    3 y1 ^0 a/ ^# {! t. ~' S

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))
) A* N/ L3 d1 R5 Y8 ^! K2 I


# r4 y; @0 ?8 r$ }' T! Z8 i
, h. e1 N1 ~9 W- H3 J6 Z

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


' I' W' I: w% M' E$ c7 `, b5 o
+ n% I* O2 @+ x% V5 P( z
回复

举报 使用道具

相关帖子

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