[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("···")


    7 @# B* E; P' B& O

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


2 C  F7 F" Q; L/ ]) N                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • / k$ I  o3 S3 ^) S, B

  • . F' g% \9 g% u7 d$ N

  • ( Z. V$ x# N' ]* M5 r) B( ~. M: r

  • ; j+ g; X: r! Y; T, u9 z7 w4 Q
  • ( k, M- u  R* T( K1 `, {; K2 U
  • 6 e- Q. U( u) k8 S, O, a) R& }

  • 4 W/ j- b6 j- }1 f! Z% O3 O
  •   W& m  l6 R/ f& X2 ^
  • # \  j& V8 ~- u, g" w

  • " w. j4 s8 @4 k3 U
  • " P) R3 ~3 x: _3 D- Q

  • 4 u- ~( U: ?! \; L
  • 3 [% p& j2 p! m9 q) `

  • ; |) W% [8 e! `  Q/ Y

  • , u7 h1 i/ Q( G  T6 b

  • 2 K0 V# q: B# w. q' d0 n% Q. x

  • * _9 L7 X2 ]+ [& \" R
  • 8 m2 A4 ~; j2 Q2 [

  • 3 Y& F9 `* ]3 U* {! T

  • ) W2 |5 \) q6 Z3 G
  • 5 K4 Z$ F/ d0 Q" B
  • - e3 a$ r( W: y" |- k, L; N+ u! L

  • " T$ q1 B. J' ~) N7 G: Q8 y6 i8 L* a

  • " C0 i) J. ~; s  y' Q( e

  • ) G$ [4 O4 v$ e: @( _; v. S  L0 @' _' v% E! R4 S

#绘制中国区域基本地图轮廓,包含省界#引库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")
6 {- z; N5 Q5 L; x3 O7 X/ H8 F, m


! X2 E, g. k, _, |0 q% G: F0 K; j8 t! Y

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

$ _" z9 X1 |8 g
  • $ `" E0 c6 F; y% b& ?7 u
  • 2 m- d5 h. t5 i( ~% S/ k( I

  • 9 }  H4 z& M6 @
  • 6 @  L. ?) n: \" m2 U8 P( \
  • ( \; c0 [2 H. f! L2 m# @8 o( P

  • " C$ N7 a& s6 Q5 S4 I2 o( r* L

  • - I2 J4 A' ?- ~/ n& w! t( V& q
  • & j& u+ s! x* [, l: J
  • : U$ q3 t' F; e7 J7 _( W
  • " X5 |, {$ g% h2 o
  • $ j2 ^9 U- ^4 Z
  • 7 ?1 h, p" o0 Q. Y
  • # x6 z; Q9 p1 I
  • " v6 `6 ?( K; }3 g1 D

  • ; z& w% f$ ^9 g# {  `2 u
  • 8 Y2 Z# x: J1 B

  • 8 G; M( c0 [4 G; ?$ b* _1 s

  • % c9 ^& ^' i, T" l
    + q& n- r, X6 L$ _% q7 n# |

#绘制中国地图,并标记各省会城市名#引库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")3 r' Q3 {  G# u& S0 `

* M6 l% ~. G3 v  ^! o' e

! O/ ~' z, g% `) W$ r5 h) H) _

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

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

f5c3384582002193c2c6c354a3d26729.png


9 G/ k; d$ _1 t
  • ( I& k2 i0 V5 f2 o0 j
  • 2 E' s1 g9 n8 {8 r
  • . V0 y4 s/ C! `0 D! u
  • 0 F5 ~" k: m; b4 y
  • + s6 r( i: a) o% O8 H! t8 Y: k

  • 5 _% v2 B, Y- j9 @2 b
  • 5 T6 k! Y3 I( D, c/ H, Y

  • 0 c% P6 H+ W: A+ I" Z- o

  • ) T+ [9 r! n  [! _& \6 S

  • / b2 e+ @8 f, H+ Y5 E
  • 8 ^; s3 p- l3 c5 ]# L$ Q( k
  • - j; {: ~9 z. T
  • - v) ?+ Z- w) L0 T- R
  • $ K! P% x1 f* ^, w6 V5 ?

  • 3 g% H  T: g9 R' |7 K

  • 1 U+ g1 l, O2 t6 A3 Y8 F
  • + |) A; q5 z' _" w  I) U% P, b

  • ' t  M1 P7 l- K/ M: s7 j! C

  • ( U4 @' `% `' Z
  • . U; K9 u+ c+ V. \4 ^  {

  • . x% q. b5 }! T
  • 8 _" Y1 {) |3 M4 `
  • ( D! D) |# y- v
  • 3 W0 d! L. D4 E7 G6 s

  • 9 Q, Q3 @8 [( n& a+ m

  • ' @3 x- p' D, W2 |
  • ) E- q4 y# ^  `9 v; F" ?

  •   B7 K* N, ~" ^

  • $ k, ~9 K2 V% x
  • . W2 L$ Q' D! \1 S7 {5 G; v

  • ) e+ f3 P1 P& N
  •   @- Z- {- n9 C' e& a$ `( p8 q
  • 9 g/ O/ ]) @/ O' V

  • 6 c! ?2 r/ P. g  X+ \' Y7 q
  • - I9 Z4 ~, v- I: Y- m4 P& D) u

  • . x: z) s! X. A8 z( o$ h2 v

  • + F7 o2 C: p  l- L* I( ]
  • & [) T$ |5 L) E
  • # a7 l; k+ ~9 W  x

  • $ z: ]& D8 Z7 G! D8 Z+ H  D4 a

  • ! d9 t4 k, I  P' K2 n: }

  • . Z2 t6 p4 M5 u' V) l
  • . ?: Q9 E" l2 y" T9 l
  • % @- \9 @' m8 U4 E4 O. x, I

  • 0 ~  W. A& l% q

  • * y. b% M7 A: O9 `; u0 k

  • 2 S& O% Q. X% ~5 r

  • . I% r; [% |" j$ {1 ?1 B! _1 `5 V
  • ; i! N6 T0 H0 `6 h9 P

  • ) q3 F9 X; T+ B( `+ s3 M6 q- \
  • ' b/ r; M/ p7 Y9 |
    * Q6 m2 K* d1 q1 n+ F

##绘制有海岸线的中国地图#引库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()9 Y' M1 i4 ]- W+ _' O2 C6 B8 ^4 @3 v

/ U5 B* r6 o- I; ?9 v2 g

  Y, H- }, B% E* C& v! r- ?

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

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

28af454b4567839d9c888c0e3809708f.png

5 v" s$ c# |% B. Y3 a

  • : o/ f2 ^1 M% b4 L! s9 j; w+ @% U

  • 4 J8 f  ]1 H2 H& C, ?
  • * R! S3 ~1 O7 x" ]. y$ H4 N
  • ; P5 l! Z* w3 r, ?: u; B
  • $ u( J: j, Q2 D5 {# n6 s1 j. O
  • 4 V0 s/ W% N5 x- ~
  • % z) {$ u2 C- Y! r8 l8 `+ `+ W
  • : x$ _6 j! s# a4 f. \
  • ! E' S6 y8 B3 D9 e4 i$ i- {
  • 6 \$ e  p4 B5 q$ {, e3 ]4 G

  • - O/ U4 c# r$ T$ V

  • & X9 }) s/ A; a- |4 b( R
  • / v4 d. `$ G6 h9 h: P, `- l" ?
  • , z; G5 r5 o- b, ]5 A

  • " y! f' N6 @2 h

  • 9 L; w( m8 M4 q$ b+ k

  •   G0 G# f* d  P5 }7 i: f' b

  • 9 c/ [" s( q4 ^
  • ) [7 P6 R4 w5 _: n. Y3 J$ W

  • : d5 l# n9 g5 r& q" F

  • 3 c5 m/ u- X- V9 h, g0 s

  • 9 C+ E' z5 b( ~( u

  • * R% V0 O3 W- i$ F2 l5 V8 Q

  • $ x+ j' X: d& q+ E& O
  • 1 X: U( G- {+ ]; w' W' Z
  • - C+ A! g! C! v
  • 7 P; {1 ~  F( i0 Y( A

  • 5 M5 T. W' E, H! y9 s9 t- Q

  • , g1 I+ p- ?* N
  • # m! @1 Q" Q8 J1 X1 R

  • 2 N9 I  Z/ Z6 x! Q( d8 v

  • % f, S# f/ G! p, z% `. [
  • ; ~% V0 }6 K% T( u1 M. J* k; I

  • / u% X) s9 m3 B1 y
  • ) W7 w4 I( _; K$ U% R3 L

  • 2 q9 g8 M2 A1 W0 a/ n

  • ) N4 J! x& s* D# }5 x* W+ z$ S

  • 8 s& {+ V3 Z7 ^+ L
  • $ E% h, W! d/ F/ A
  • 2 i3 u1 L" H& D, P

  • $ o" C+ `- h) H6 z1 d9 D- z; r
    , d' O- K- @% s, s

#例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))
! _* ?2 I3 f8 {6 T1 O

; ]. \) a8 c' W' a- T! a

  M- b; u. |8 W8 r( O% X
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


' e, @& l" X# n& D+ y" A+ n, g

  • ; u- E9 _% ]# M0 d' Z( R
  • ' Y! R4 R) N0 h& S
  • $ b" a: C' [+ }7 b
  • * A. S: Q0 k# k9 Z/ t6 ~* B

  • . w" y' s: K5 m/ `

  • 9 d1 m+ \" j2 U! \# f' n8 F8 ^
  • 2 a6 `7 f0 W( U1 C. ~0 q
  • . R/ W1 m. h0 q( r

  • ' O; {: a: m! I

  • ' G) j3 W. Q/ F9 @! Y" m
  • , m7 b- k+ f& w% k! D3 D! @
  • ( P; g6 D2 G" U8 U! f

  • $ @' }* B5 q  R1 R6 S

  • " R- \9 M$ K% R' R

  • 3 g5 S+ E, V6 P2 p$ z
  • $ v/ q" ?% Z% m8 z' ~

  • / K% E6 ~+ V* Y( V0 s
  • 9 ^, j4 m& z5 T5 N) w

  • 9 H6 `  V, Y* y
  • 2 |5 K% Q( t! _/ ~9 T

  • + G" M$ I7 n' w/ V7 m" k0 U% c
  • 5 L- k; v5 D5 q! f; y9 V
  • - T3 n1 X# ^0 Z& V6 [

  • & g4 Y* Y  V5 r% [/ O) k' j
  • 3 R# U! z, M4 y$ |- ]9 q

  • . U* Q4 [# I- G0 K! Y3 ^

  •   I% j- S# S; v& ~1 U

  • 4 l! [1 i2 |0 g4 E/ _' N. W% q

  • 6 j* C( D1 E0 K! U8 ?8 P

  • 4 N! c& e( M, }, S2 f% }4 A  \
  • 6 `; _" g* T; F: f

  • 1 ^! n' h+ }9 E0 W" L

  • " i6 A. [% G3 T* I& l2 Y! q% t

  • 1 b7 `! ^6 g/ F" [  l- ]' ]. i

  • 0 f/ i2 S0 e1 g* O8 ]7 G# f
  • - d# d0 V# E' R; `* y- p

  • ' L6 s8 O, H2 x. H) u" S; v9 ^. F

  • 1 A" {% A( v( X/ @

  • . E. I' {6 J( o, S, B" N% H9 G5 \/ \  c7 ?7 E; S$ x+ F

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)), u. ]: r$ ^2 n) R: q

1 [. l5 I6 i" F. i

0 D6 K/ k* {1 M( M* U- c

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

" y# y0 }/ x- u- }3 {  {
5 s) O9 Y- s# l! H9 W

相关帖子

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