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


    / ~4 [. F# o+ C* z  \/ g/ F

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

" s4 P- ]) |% U' g6 E
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • 8 V4 M7 V8 y, m5 @. ~
  • ) ]2 U6 u2 h9 y( J$ ~/ [4 {

  • : Y' f3 K" q  ^2 a9 u( X5 R) @# h

  • 8 Z- |2 J  ?1 `8 s& s
  • 2 ]2 I. q$ v7 ~! O$ w
  • 2 x6 ?2 l+ G. @; L" u- ^% N0 j

  • ! @, q" \) m+ ~" @" ]

  • ; k" b6 Z% J) n  G
  • : {& e9 i$ H9 j" n% q; E5 |

  • 5 |( e8 L' E1 Z" F  e$ Y

  • , d: L/ L! [; G5 H' b$ K+ ^4 n* Q

  • ; A" z/ p6 M0 U1 f1 b

  • * H, ~) T! ^3 w/ p3 [+ [
  • ; @2 v8 _8 i0 N8 w; c, _1 a
  • " N% Z: h, o" h7 S
  • , L+ L$ O3 i- t( ]/ r
  • ! A- v' h( T  F$ W$ \$ y

  • ( n) g# A5 ?/ o% v
  • & q# C$ ~5 `4 v6 ]  c

  • ' h1 ]* I3 j) S2 z

  • 9 V8 l8 Q& H0 ~! d& L; K' i
  • 0 _) x2 }+ [5 S$ Q
  • 3 d+ j5 m9 a$ @8 `7 a& o
  • $ [* h* o# K: d7 x  K% t7 J
  • + L+ s5 F+ r# N  v# ?+ G( A  w
    , _$ Q4 T8 M* D3 ^$ ]

#绘制中国区域基本地图轮廓,包含省界#引库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")
( }5 I9 _* P8 ~# J9 g( X# _$ G7 O3 Y

0 H: ?4 k0 A+ m2 M2 Z7 X$ o

: y6 a8 Y6 Y% }% D7 S1 I# ?

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

+ M+ m& I2 f; O; T4 |7 r5 v! y
  • ) o7 \* C: d4 |7 P6 j

  • 1 ^. Z; q5 I* B! U& _

  • : p$ L& }6 o; l! `

  • # {5 c$ p, C3 V  b' o
  • & q4 Q% x# r0 P0 U& C- C, U1 J
  • " L2 G0 I3 s1 ^, W

  • 6 N% R3 f5 Y- I% W9 K/ X( Z/ O' L

  • 9 }. d' `1 Y$ n3 _9 d( {) S: J

  • $ ?0 f, s0 s& {# ~/ j

  • ( M4 i- h* ~7 t- N3 N" P

  • / }  J5 r# |" Q6 L

  • 6 i5 d! F" h' Z9 u* H: y' O# u% T

  • 6 c" S2 K$ J- K1 f+ Z
  • , V% n! ?9 N# l0 k
  • 3 U; w) e; T0 v: x! b& w
  • # O/ S, R! l" D! S6 q

  • ! w" k0 ^2 P" U0 H* W

  • 6 t0 N  K$ j& J. e2 D: N' |: g3 Q" m' b- B2 I9 u& o6 @

#绘制中国地图,并标记各省会城市名#引库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")
' b6 S3 ?# F1 c( e+ O2 l8 Z

% |. }+ D: ]+ v  U( }( S# f0 y4 c3 W
  a# z1 b9 Y! l. S0 `2 n; h; G

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

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

f5c3384582002193c2c6c354a3d26729.png


6 {2 M9 k# }: N& g* u5 a0 J

  • 3 A3 {. e- f% `3 T) ~3 }

  • ! u9 |8 q, p% U' V5 R: C

  • , F! R, i$ Z+ e: A  r$ b
  • 0 A1 w. i  @( }. b

  • 5 y0 X. @8 ^  |: }. b7 e5 \
  • 2 @5 @# r: |+ a; A! O+ s- Q

  • # C: L! p4 c- t+ G2 R, @# g! I

  • ' V4 c. {( ]( N7 W5 v% \/ w2 R* G
  • 5 b& s( R9 c7 H7 C/ k6 Y8 _
  • - I* c: i- F8 H, k
  • : w7 V2 E6 L6 V: |8 S; T# P

  • ' L; v$ [, O& k- n* W

  • ' a. Q$ |& `# D) h. z! }5 w5 E
  • / z/ Q  b" m& {4 B
  • # t' I9 t* @, v' Y
  •   u" N& L+ D, N0 i& \

  • 6 s" P( F7 z+ T6 q$ I

  • ! u3 T0 c! M5 S( X7 \. h2 p! g/ S
  • ! I: U9 V/ M0 Z& p4 G

  • ; @+ O* O: _1 ~
  • : @; x6 o# j% R2 {% ]' n

  • ( ~" I0 U' a/ u: i5 D0 s
  • 1 \' l, Z; g  n
  • 9 e- E, o/ }. L3 V

  • + S  B; ?) j8 I5 o6 f, X
  • 6 ~8 G( X, s! c% t* z6 D) n4 I

  • , ^" r8 p. u$ |) Q9 K
  • $ v  |- H- e% m
  • / M$ G8 n% `7 _6 D7 ^) w; G7 s0 w4 ~3 b

  • " e! A5 s5 I2 z
  • ' \3 j/ ^& h: x$ r& O3 H/ i

  • 3 V5 E( k; j' e
  • 7 j/ @: |, N# D  d2 N  I7 |0 l

  • $ G6 \! I4 C9 L; W( b$ Z  n# b

  • + O: K+ ?" R9 `' y6 p
  • - `- v$ r+ L7 B2 Z

  • 2 Z7 n# Z4 E3 _9 @; Y

  • + g! G8 G( l8 ^4 S; q
  • . v; t' }4 v, i, o! t
  • : A% c2 V3 n- P# B) _
  • ' Q4 P1 J0 {: }( A$ D9 c- f0 L  ^1 b

  • * H7 D4 K6 D3 f8 W' ~
  • 5 T, F* V: v, M  i; E+ R/ j3 j5 F0 X

  • # r' i5 c, Y4 b  n! z! S" W. p- E

  • 2 M$ i9 @( {. o% @/ V! |) ]

  • 2 @7 Q* z' t( Q" y% M! r& E

  • / y0 G  K( ]7 S( k
  • 8 A8 R+ x' N, s

  • / l- g( P! ~$ C* I: c
  • 8 Q( F! Z+ k4 n( D' r' t% V

  •   e' y; N1 ]) h$ O: D& X" ?$ h
    1 e/ _, k! O' @3 N( _3 ]5 s

##绘制有海岸线的中国地图#引库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()( E' q9 b( i3 g$ U7 y8 j

: x* |% I. {9 [. r7 o

0 \7 q, }- l$ c1 ?

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

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

28af454b4567839d9c888c0e3809708f.png

: T8 S$ |/ p8 X, Q* M9 Q: U2 _
  • 0 o) ]& j7 [2 ]' e

  • 1 g7 V0 Q4 [/ Q1 e7 U$ ~! t
  • , M% U( |1 M: a9 [1 n. D. o/ M0 `

  • 3 {8 c; ?6 W; J' |' m/ C) P8 B" F
  • " \7 F8 r: G: ^* i4 l- V  Q' m

  • 2 a2 z3 x( D; F! o7 m+ \" p! j

  • 1 t2 G) ]( |9 U5 R$ N
  • " G# ^+ ?* t/ k) ?

  • : n; U! ?( S  _, J+ M2 O
  • , z* t4 p' K( K; P1 ^
  • 6 e  @" B/ q; b  ^% A
  • 7 h+ m: o, E. `+ y: `
  • 2 f7 U6 x' d# L- X+ \8 _* I$ @* q
  • , H; P% Y1 R0 r' F2 f4 d' v
  • 8 `, m! q0 ~4 P# K5 f
  • 2 `% s% m! |9 Z1 e6 _6 i9 J

  • 6 E9 _- u; M5 A8 C1 i- O0 |! C# I

  • 4 m% i( s0 g5 d4 S2 C9 A' G8 b) N& `

  • ' `5 j5 V+ [5 o" K$ a8 O2 [
  • ) Z8 M3 M3 s; h' s

  • 7 e% M* I' l: u' q- n" ]4 @

  • ) m7 Z0 W$ y$ E7 G% y' K3 d, j8 `
  • ! E9 b/ ~8 u6 ^9 x% J! |  c

  • 8 }6 b- ~6 K9 m7 T, f8 m4 U: p: L

  • & F2 B% i; d* L# z* G) H- D; V  D
  • 9 P4 R2 t" `; u" [% K8 L

  • 7 H$ c# x0 Z+ z' x$ f
  • 1 {; Y+ @5 i' l) Q' Q
  • ! d/ n% ?" ?' [2 t9 n- G) G) N% \7 a  K
  • 6 p' S, d# x9 x* o2 d

  • 3 j: O& \# D6 t* a

  • ) A* R, R) A9 ]+ R( M+ T  a' C

  • 6 y5 f& u; ~- T# i, I9 P
  • 7 R6 ?5 [8 R7 M# g6 @. ?

  • / ~) g' m) u- L3 {/ E. W

  • 8 Z# N$ y/ v: V
  • ( X$ Y5 h/ g' S; T) l% X* L/ `
  •   O* Z  W7 p8 [6 ~/ A% |" }

  • : c7 g0 n/ M5 \4 N+ h7 W, i: I

  • $ I* M: R+ y$ F4 n' a8 g5 f
  • 5 [( [6 O' o! E

    % }+ n0 e" c7 B5 R

#例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))+ z( g/ W% t7 M, l2 w& V$ P

- P- X5 }* D2 e1 H' D& Y


. I) a4 P: D2 Q: ]                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


' Q+ q5 A, O) j; R/ x% I$ l+ w: \
  • ! j% L9 ]3 ^$ z# r' o

  • ' r* J1 R1 ]7 C( Z, M: d7 ~
  • - h! p% R  w, I7 z/ d9 e
  • $ P# `& N% v9 p+ p! o0 A

  • & f4 s2 n" Q0 T2 `3 @0 i# a0 H

  • 9 G, ]- w$ i* D
  • & F$ J/ Q6 n3 O5 R( z7 s; p/ F

  • - ?! N5 J  B( D0 t$ M# F) T
  • . y: j& U: e: u+ s1 s  B

  • " G$ A3 s% D( O5 Y
  • + c' T6 K" E5 X0 B$ _+ K1 Q

  • $ y9 |& J. r0 g; P

  • 8 v% C/ {% z0 v" T# K" b

  • 1 N( ]0 Q/ `( u# K+ [
  • & _) s1 H- }) ]$ z9 t, J
  •   r! z' m& N3 [1 U, H- N
  • 9 V# ]# v/ }2 W' i3 M3 l& C1 R
  • 4 ~  q& s" x  O- v
  • 2 f% Q5 f" V. [% G! ~! L
  • 1 M. B* g: V& K; K5 D

  • ; c( {( }: u- U9 T$ X
  • * j# ]7 F+ M: ]4 s$ T
  • 6 L9 V" O7 J: S: f+ G2 A
  • 3 R2 N- @9 J5 q# K

  • . n; D8 N+ [- j' L6 \$ ^

  • 1 L; e& ?/ G& p! {6 X2 d

  • ! C( \3 S" [  o) l

  • 4 f9 m3 r8 ^! i
  • 0 o1 m/ T/ X9 J/ i' ^7 W/ y

  • * ~6 r$ q9 p; m2 Y2 a- m

  • , _5 p8 ]  x% @' e. u; d5 ?5 }
  • ) Z6 d1 U1 c& P0 r& s  u3 J

  • * E) U7 x# n* L( U

  •   g, v/ K& V  ~; n3 N
  • / t4 b! T1 H4 R  R% P+ w/ {) k' J

  • 1 N+ n7 k2 L9 l' r9 @$ N5 R* x

  • , \9 [* M2 N6 t! s" P, r" B) O% i
  • : P. I" Y8 }# J, s

  • 8 C+ ]( ^: T  j" S: u: G2 _# \- U! q+ X2 _% B$ t

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! n2 d- O, n


, F2 e- o$ Z" {- O2 v8 w) j( Z( E3 o- x) q  g- `. I

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


! K8 F9 s9 a/ j8 B. y+ F3 L  m- K0 F" J& q4 S

相关帖子

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