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


    / m" ^2 p; j, N( M7 v3 V

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

0 ?- H4 Q( z& S- \9 f$ z
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • ( v2 J& U8 o0 T  e  Q5 X% S
  • 0 f, X2 \: R+ ]5 T2 |8 K" v( u

  •   M9 k/ `/ @5 f0 s$ m

  • $ r7 K; u. J" E+ Q

  • * a7 z9 D7 o, A( s' i8 C$ {0 w

  • ; l% i% u$ [' _

  • 5 L6 E. S/ s  V7 C* a# [

  • 0 l6 Y5 w) D& _" P
  • 7 p, Z& h3 `9 w  M. l
  • - a8 O2 @  A5 @5 x4 Z% e
  •   I# g5 P$ a/ \

  • % L. B# v, R6 F: I9 B% ^

  • 6 ]! W# o8 L+ D- [$ p: H% m  z
  • ! {6 G$ ?. P; s/ j

  • % x: A6 s7 d/ ?+ g: F
  • - D5 z1 h8 Q3 J7 A' N
  • - ^6 U) _# V, O: s6 d3 i

  • / T- Y$ H" P# g9 B, Q5 D

  • ; G& D& @$ z- f- E
  • + t6 {8 D) N" d" D- b2 K8 r
  • 4 ~; ~' n3 ^; d  Q7 x

  • 3 D8 S+ \2 R* ^: S$ T" u+ O
  • ! z' J/ F% A8 b2 [1 l% v6 o2 `
  • $ O/ c. U5 y, V+ T0 `) f
  • * \# n3 V3 O* d( V9 R7 K
    6 U% S% Z7 Q8 a# d3 p

#绘制中国区域基本地图轮廓,包含省界#引库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")) q9 t# {! _% G* ?* C6 _

7 _' r0 |3 n" M5 z: ~
$ _% Z) a1 V6 ^( V; \* w1 ?

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

9 Y0 G/ I% H+ R  w) R

  • ) I8 \* m0 A7 o5 C* y$ \0 n; V* ~$ w

  •   o  M) A, W9 b$ b9 @6 U

  • : a9 i( n8 s7 F6 J! z
  • * E6 Z7 J9 O7 E- w

  • " ]; i) i+ d6 U+ o% @
  • ; H* ^& v4 o  e/ Q7 x+ D

  • * U( n  A% g$ m% {4 t8 [: I% D

  • 6 {% k2 b! ?! F& Z& \
  • ' N0 P% a  J, u

  • 0 Z$ W/ z2 D1 W4 J2 N9 b0 f6 r

  •   b1 i- R2 L' S& b6 U# b

  • " t* U4 q; w4 U  T* \3 d
  • * I2 c' }/ F0 [
  • " S: W' [" A0 Z
  • % L' }; h5 Y) I; N/ J
  • & S+ `% R+ s% e1 g

  • ) V/ @/ f- m4 b2 M8 H5 z5 X; ?
  • 9 p; J# b* |8 A& S; j

    4 N6 R1 X; J3 L

#绘制中国地图,并标记各省会城市名#引库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")4 ~) u2 ]( D1 \) j( C


( C% B, s  Q; w. e- Y" H) |5 i- D, |& R- O: `6 L

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

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

f5c3384582002193c2c6c354a3d26729.png

( ~1 i: U. e: _5 I/ A
  • 9 E2 A! a% z  [7 N1 l5 J( h

  • 8 @2 V& @" \4 U, b; t* R/ w
  • : Q, C% g3 p0 w' B& p' ^

  • 8 Z4 M) ^# S% E

  • , L/ S9 I" h3 j2 C# d8 i$ s4 s
  •   j* f& E3 w: H5 j( z  Y) p0 \

  • / A; d4 h! D, w: B+ i
  • & Z5 ~- K! F6 Z2 R4 p$ q& X

  • " \, N* [7 D, m, C% R1 k/ c4 M/ S

  • 1 m# f9 d# I$ F# U
  • 2 S, r; H7 @* q: M& \5 K
  • 4 Y8 |9 R$ ?* @: {$ i! B: \& R
  • ) w/ h" w% x6 Q" Z/ m, Q3 @" p. m

  • % F( p4 |; g( _7 s+ q8 t% C, y0 F1 n6 v
  • / v7 r& Z% K8 E5 l4 m
  • * ?' K# s7 y1 M( c: }# m% u

  • + y$ K  G' ]0 W! j* a4 b$ E0 v

  • 1 v  ]. o8 w; e" T* ?  b3 G- l" H3 Q# _
  • , L+ c. h! j) L* H
  • ( H- W+ A9 A! q( C* [1 {3 e
  • ; N' f% \  z) S! Z+ p% i9 r

  • " K6 r4 P+ r$ y+ C9 g7 R& B

  • # C1 ]5 M8 g- R# P
  • , A: ?7 P! u$ E& _( Q

  • # F% S  ?; ], T2 o4 N! C

  • ! {7 P" V9 n+ O! ~& Q
  • 5 F* `+ {2 i& x* o$ X
  • * K. j* }/ t, t9 v

  • 5 y& r: e* W( X6 G* f

  • $ I7 W* a' _# k- b+ F6 T* Q

  • " t* G2 E( w- x

  • 1 m5 [- E- }0 A/ o5 @1 V# ^$ @& P% n
  • : `/ W) E5 `- Q2 v# u! }, M5 U
  • ( s" u- L& e* _( F, v2 P0 Z& q
  • 7 M. S) M, z5 b  ?0 E- @" Y5 i) o

  • & ?3 G- a1 _7 e& T3 c

  • : z  P+ i+ M* K
  • : r5 Z1 @6 D' M5 r, k: b; z

  •   W9 R7 P/ t# H% O4 T

  • . _2 [: d1 d/ c6 a% W, x
  • . q  }! H5 W% ]
  • 6 n4 p- Z3 y9 x1 x+ G! F0 X- o

  • / S9 r; L! S/ a, l- K" n
  • # H0 D1 ^4 W4 f/ t$ o  S- f
  • # c# {5 ?$ [; N% i4 E6 \
  • # _# w& f5 V. n) w) J5 P* w; n
  • ) _; I2 Z0 S) g8 ?9 J5 h2 Y& T

  • : c  i: [% @0 l. }
  • 2 J% q) k- k, v# f7 T& k
  • + n* z, A6 m. `

  • 4 h% K2 X6 }9 A" E$ X
    6 W' U2 x( H; \' |  o. Y2 L6 P+ m2 |0 C

##绘制有海岸线的中国地图#引库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()
. W  C* ^* M% d1 o

; K6 w: D7 Y5 t

: ]$ `6 C4 ]* S7 u

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

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

28af454b4567839d9c888c0e3809708f.png

9 r( M4 R' x8 g& _# p  v2 D
  • 6 {# A1 l$ B, p
  • 4 Y& W$ U/ q6 J, o( Y: o; I7 @, n
  • 4 V$ W6 r/ g$ X) X) v

  • ' [: L. q7 f- v7 ?  r

  • ) r# G; t4 u6 V: N4 ?2 ^
  • ) v1 H; w; Q! {' z2 S

  • # Q9 E2 y' K8 s6 S, F: X% z
  • 9 Y8 J. t: m. E6 t& s) L

  •   }* |( s# ~( u: e5 k3 `( u! J

  • 8 ?+ Q. m7 b( U* ], Y

  • ) W" `' w( f7 \5 e$ h  a2 B
  • ! s* e6 u+ |1 D0 [9 l
  • 0 U/ Y. M) `8 m
  • 8 f9 `/ @$ d$ V: U" o5 x

  • $ K" K0 E* B1 Z; w
  • * Z' a( B/ |; ^) H. z& _

  • # @2 B  I( _! B- O6 r* |3 [

  • , M4 X3 l! \3 E3 V) K: c

  • 6 p# x7 x5 I7 x9 F1 _- l6 I, ^

  • * j+ L3 ~( M" t& v! `' I4 Y

  • ! K1 P9 E2 z7 F; u. i1 V
  • ! {, H) v8 l: g& ?

  • + v, @$ G; O) Y+ i# [/ N

  • * P9 L7 M: W: a3 X, U
  • ' l6 p5 p4 B, P8 U
  • : G$ _/ C; b9 J. `: o6 p' x
  • 8 s9 o8 t. i& m: W8 G8 ]

  • ; W! \- ?) e- O2 `/ \
  • ) `  }6 t6 W8 y

  • 2 m1 G- x+ U$ I; b5 `0 {3 c
  • ' t" w6 P$ E4 |9 H0 R
  • : u+ j: a  h% g) h, w" h! w
  • : S1 `5 C, @' Q7 u3 t. }4 N
  • 4 T$ q  g" G* F& `- k# G
  • " M# i7 z1 k+ d
  • " e# k9 B/ R4 [
  • & u" q7 t! _$ y8 Y2 [' a% L
  • 3 H! Q  b$ P, _# u! N: {% p7 T

  • ; A# q9 _& H4 L* T

  • 1 {: d* R& Y; L4 \2 k$ v

  • / G5 e, ?2 @; H( t) p! s+ |
    ! s0 g& }: e! c

#例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 c/ r% G3 @0 n6 Q0 N


$ R! Q: x1 V4 T+ f7 p


- [, k2 D% Y, y8 b                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


3 _) Q! F& E7 w& X: C2 I4 B" P3 ?
  • $ Y4 d$ n1 l  \( m0 d" b. V8 {. \  d

  • 4 `$ P; C' E  P0 o6 M

  • - P+ [/ J' F1 \. O! e7 c! F3 ]8 ?
  • ! z' d# B0 L1 q$ N5 l- q& D
  • 1 |8 m4 [( G! o: L- F, F

  • ( G1 s9 o* R( `8 o/ ]: I' e

  • % v. S2 ~* I8 Y0 ]" Z
  • 6 X5 R1 O* z- S" K, p
  • + t5 \: j- I0 L9 _
  • % w) v/ S- _' q) L  ?2 M( e2 P
  • . ?/ Y$ A, D8 D- s9 B& M

  • ) ?. Q# n2 ?+ `; s8 _, Q
  • 8 k. _  P/ o' T" l0 t+ W( y; ?
  • - ~9 G) T5 T2 y! j9 g
  • " u3 T9 u; \) f! m  M
  • . l3 C* `, n% e9 I& B* f2 L( D

  • 5 B0 @  S: s( u' D
  • : l1 U$ v  N" m/ O: k
  • & B  e8 f, H3 |' ?* o  G; q

  • 9 |- k5 W5 c  k4 u$ t1 H
  • 1 _5 x- N- B4 M  p0 w$ h% C* E& Z- b
  • - R0 [! c. t$ ^$ \, D" D4 O# c
  • 6 `- G# X- l  W- C! E. u9 I& v
  • ( u0 R4 n( \4 a! w. J7 O; T* s7 U
  • 4 p- P: a/ l: X* b+ l' y4 I: w
  • 1 B) |$ l% W, K% y( N* W  U
  • 2 d7 V: R' c0 L0 @9 y7 T
  • 1 k6 z6 S5 p4 d+ @! v  ^) ~

  • ' k+ g; Z3 z" w1 A5 V+ S( J

  • : H8 U  T# U! y8 t9 f) A" a

  • 8 K  @) i# F! D' ~1 @
  • 9 l" \8 s: R8 @2 \, H3 g. o
  • / Z; Z, E2 V6 @! j1 R

  • 0 Y- m& P' e9 R. r7 V) k
  • + H  J" ^6 \- p
  • 8 l2 Q7 y- u! ]
  • . N$ K; _( }, o$ S8 g% o

  • 2 b0 m, r6 l2 k; G; O, r7 O. r& C- ^

  • 9 T9 O, p( z8 b% G; N; q8 v' Q0 D4 H) {+ A) i4 L. \+ d1 K

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))
$ Y- i: `: Q7 g" F: `" e7 c# J

+ |1 E9 B, F0 {% _" z

  h1 K" o; ]/ i; ?

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


. y8 `& z" A1 n/ i
& r+ c; S( W- B  {. H
回复

举报 使用道具

相关帖子

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