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

    ; \, }# T  V+ r2 }

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


0 P0 b. J2 X& \7 Y2 q; C                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • , _! \3 r) t% g$ I, c. q4 S
  • 9 J* j) X7 O' }  W4 {

  • . u6 L) Z- t( B1 T6 _2 S

  • . h1 p9 U- F8 r
  • 8 M" A1 X9 d! ^

  • - T; J4 J, L2 G# C+ g' d. f
  • ( C+ o5 Q/ H; x- N9 P
  • 6 Z( ?& _: a8 _$ b, U$ A0 N, s5 q6 {
  • ; X6 Z8 C0 e; s1 K7 v. K

  • + T# y/ m" X3 Y2 X  ]' t
  • , d2 b  r4 x, Z: a( o

  • , l8 q8 R; R, x7 g8 \1 Z
  • ! r' [8 _7 Z7 y. i7 a, G5 _" R; ^
  • 9 t/ @1 x0 L4 Z
  • $ v1 ^4 Q0 L6 h/ n

  • ; w2 O$ q3 {( L8 Z' a
  • 7 Z, O, s' r/ A7 }# E

  • / G& Y) h, w0 w
  • 1 n0 z( m  F! W  L

  • ; L& b( ~, u: u% Z4 B/ Y0 U0 \" _

  • / {/ W4 q. B+ W' J0 G
  • 8 t9 u6 X3 c$ d

  • 8 K0 V9 X8 g/ a0 V! `  M

  • , c6 ^) [: f8 g! d

  • 0 A. E" S1 n' T8 N2 d9 e$ V$ G2 }4 J5 F+ |

#绘制中国区域基本地图轮廓,包含省界#引库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 {4 r& i2 Z) v5 X

0 g# j+ L6 k3 M, U6 G' K

4 P6 p" Z5 a) Y7 m0 C

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

, V: n% A/ J- P: b

  • , Q+ a9 A' S% R! r
  • 1 P7 T6 O8 E0 N) v: k  x1 @3 f. ?

  • 3 G- z. Q9 x; {7 C, j% E

  • 2 U$ T2 f9 E: v( @( e* `5 H
  • 2 b: i, U" L2 G, I5 E

  • ! \+ S/ {. o+ b

  • 7 x  {, F6 ]" I0 n8 j2 i

  • ) k" z% H9 e) a6 R# `. Z8 D

  • $ L& L3 Y% {7 L4 o

  • # w2 U% j" [+ e' c0 _+ ~: [

  • % G( D6 c* G+ S
  • : C& B0 L# Q, n5 H5 V) b. r
  • " ~- ?$ ?9 j# S9 {

  • ) x6 u2 b7 I1 ~$ N

  • - P- d) r' W+ v  _& {, M5 p

  • " h# D! {% [3 [9 ?' E$ B
  • ( R9 P' z+ S- p" u3 q

  • 1 M/ y4 ]* T2 a$ e
    ( p- E9 W. |) L* j" k; z! {

#绘制中国地图,并标记各省会城市名#引库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")
+ B$ T* x8 n5 R5 w- x! L


9 X1 p6 R) c* o4 K4 W* j* s  i* z) [& U. n' h

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

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

f5c3384582002193c2c6c354a3d26729.png


+ ~8 D; ~# o8 D# q/ |  `2 i9 f
  • # J3 ^8 J2 {8 F) I

  • $ A, @9 e! R4 H6 B$ a2 v6 w
  • 5 r* F7 _8 K/ ?. y* D( [, \- I$ ^
  • - K! W8 T' ^2 _& y* o8 a

  • ! D) K  x9 y3 I$ \, K

  • : t" U0 H& @0 n1 A# R
  • + ]. M" ?! @) h/ G# I' Y; I
  • " D. P1 s7 i+ Y" @) M9 L# T" B
  • 6 x* v2 K! _9 s* ?
  • ' ]* m5 d7 ?+ R" e2 U9 Y5 p

  • - @$ j1 x( l5 U7 I3 Y  k

  • 3 a& D  C9 u' y

  • . `$ ?! E0 E7 ^, D
  • & R, U3 W' @4 v6 e1 L6 }

  • / a& N# i, a! m  d5 i
  • 8 x8 O0 W, B& }( d5 E/ I' A
  • ' O" d4 ]" V; w1 T

  • ) h/ x; S& \" [7 b
  • 0 _7 o4 k- z- R
  • ( x. Y( @/ y2 I# Z" q

  • + k: ^! n$ Z$ F3 V
  • 9 _! E: h  M5 [( O

  • 3 i5 G5 o1 A+ _

  •   C9 ^. R0 f  ?% ~$ \  Z8 S
  • ; O' _# G! l' I- ?

  • * b7 q2 t9 X, f: _( M& |

  • 0 f, S% n- ~2 f& k! j& m# ~
  •   ?7 F: |9 q, |' Q
  • 4 b' {+ q; t! |$ `4 S# |) R" e
  • 6 h5 L0 x# y( v

  • " k* ?* l- {- z) ^, u% r- E$ q
  • " |5 w' i$ `# |0 I# c  n& B$ n* q
  • $ A( e$ L1 g8 A; U( q$ P( j+ ~0 G

  • % y1 ~5 c* l& p* h5 Q4 Z8 X5 U
  • 2 l7 F( X0 J( g3 p: b

  • 3 o4 I" O4 Z7 o
  • / W7 d) [1 n" Y9 A* W
  • # I+ N: ?3 ?# s# `

  • ! a7 B) `3 V2 R) C5 u
  • + a: B7 K9 s; P9 E! ~
  • / N2 ^. _* h8 V9 z5 w6 ~' i& \

  • + |) K' L4 w) Q2 U
  • 1 L2 m# V# W4 Z! f7 J0 P
  • 5 `& m2 @0 Z! _& Q" b

  • $ O# r! r( X8 Y- s$ l+ `

  • & J$ d; s, X3 U! Q3 C  N) T2 u: S

  • . N) z) L' d8 q* \3 p, Y6 J# T
  • + h# D( \8 e5 I! L! i) G
  • . ^2 @9 q; [# ?3 Z! `; O, U+ I& c& a
  • ; J  Y7 B2 \# \
  • ( Z# T( ^, @( J
    6 E/ E; s7 r& F9 w; }! 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()
8 ~! t/ P9 k/ B3 g  M) X' S

* V$ V& n- ]4 U3 N0 S. |$ m, @, W
- i6 ?9 P, V5 q" g: e( Z( x

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

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

28af454b4567839d9c888c0e3809708f.png


$ X9 d) D2 R9 [
  • : P+ B& w; S" \" `
  • 7 j  T" U2 K3 N! M' w, R4 Q# Z

  • : S& v9 _! B+ w% {1 o

  • 2 v  e1 M3 B5 ?; X# Z  b+ y. U# s
  • ) Y0 T" h& ?8 g( k

  • 1 B; ^# t, |' n7 `

  • # A' F! V; K# P2 [0 b5 Y' B: ?

  • " a4 h% d$ E- S: `& p

  • / T! W) b" c7 A# p. I
  • : D% m* ?, L' w2 |( C; h
  • 5 U) y3 m* I- [! W  I% V1 n5 f/ Q
  • 4 d2 j: x* |; F' ?
  • 9 E' \, J- c. Z& I3 B9 n

  • : o8 ^5 J5 t( }) ~' v2 ~

  • $ `/ p# X! h; Z2 T0 W3 g) j

  • : R# J% a* T! y* g" \  |5 P" [

  • - e5 o% ]0 e% U; Z5 U# Q
  • * f% ^' t# m: A

  • , x# x' e& g4 D4 t' Q; @

  • 3 @3 t! n) P* e, C' L' w
  • 8 ?  v- v3 e9 @8 _. q1 {6 [$ r2 M
  • / k+ @* c2 U3 z% c% Y( d) k5 m+ j

  • 1 A7 ]6 O' P/ k8 z& A: h2 D9 f2 K
  • 3 B! G8 \" h% O# a! K
  • 2 J  {4 P4 h7 ?
  • - c9 V; e6 R6 m0 T
  • 8 q7 T' O; E+ v: V9 a$ \; Z' v
  • + }5 F5 m7 Y, ?; f% \
  • # k7 _+ ?4 v+ a+ ?- C' `8 v; [

  • 8 }2 i- s7 X! g. r. |# Y

  • . f6 [8 ~1 m4 J, a9 u$ u

  • # y- e! `4 b: [$ W# H' |% W* L
  • * f/ {4 n4 J+ w/ R# A; W6 ]
  • 5 X9 E( j* [2 I% F0 d% _) \; a

  • 1 C' o: i% S5 A& K# l
  • 8 m0 q8 \; Y9 d3 w! a

  • $ k0 K# ^& Q& d' C( I1 B7 U0 ?
  • ; P9 W" q: W) ?& T# u

  • % O& |3 X* \( r" K
  • : m$ t- k' t- d) Y* b! r% D1 N+ {3 K
  • % M- ?9 k7 K6 x  z1 `4 N
    / }2 r  ~9 S  X( W$ Z$ T

#例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))
- B+ E" Q9 [7 x" L! p$ w+ {


/ k9 g4 M" b3 i5 o# ?* s


# P' K: x8 b. H/ c                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


+ v/ f6 c- k/ R0 G- Y: G. B
  • 3 ?( Y( S2 M4 U& S' |; c' P# o
  • * m- Q( L# r# W$ r, Z+ ~9 p' g7 |
  • $ e( E5 I& }" B! x; p* h2 G
  • 8 l/ G1 e8 @, p

  • . L  W; t1 X9 S% f
  • ! ?: \2 D( w5 y0 P3 Q- c" D" i
  • " ?% A. P/ q. j) Y# G

  • & }$ X" E) X) S: q. O
  • 0 \3 b" V3 ~4 l+ E" E- H, z& k

  • + q* \5 X8 n  E9 u3 [# O) A
  • , e) o7 |" ^5 U$ s/ K$ W

  • 3 ]0 n" ]+ F$ d2 Q, x

  • " J! u3 p+ j$ P, y( F4 E
  • / |5 y3 d/ _, m
  • $ g# P" f5 j& v, O" Y

  • # m  k  E9 U4 S- s2 k
  • " s/ o$ M3 \4 y$ d7 r- M. r/ \

  • 2 E2 e4 s5 m" |% [
  • ) ]" h# f9 l4 D: I3 U

  • $ X( w, a! s  R  ^' G$ n
  • + K8 z$ K7 b: N- {: E* ^

  • + N0 E/ @9 u5 r

  • 5 N+ I4 _' D' M# u9 n. p

  • % }2 ?+ v- B9 f" p* x
  • 6 L* E! A$ }  y" {2 b7 J3 ]
  • 1 u" Y0 ?) c& X! J0 [5 P
  • 0 W5 p* o9 N7 w& r# R0 ?0 B/ A
  • - y  y, S. L8 a# g
  • " [' Q& b5 T' r* y% m0 M

  • / p: N# j) N1 X

  • ; o; u3 p) q( O
  • ) A0 m# b( q' z& M5 ?* d! L; S
  • ' J$ I4 N& A0 W+ Q* D' d( B' [
  • . A, ~4 N0 k' y1 h: O
  • ) Q* o& e6 K/ Y5 l3 l% X, J8 h

  • : c5 N" |& _/ o0 j+ |/ C7 s
  • 8 H0 d& U$ Y9 o7 I* K4 Z

  • ' V" }. `. {9 k! v+ I! C

  • ' ]4 r& p- U+ B: N+ ?& S# ^( w8 c6 q6 ?$ G

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))9 t% X9 J  u& Z, f  @& N; P

- f: j$ V7 O  @
( C9 i* r, W, R! J: @  c

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


% H" x$ r) i* X
( R: F- z7 c8 f' z& Q
回复

举报 使用道具

相关帖子

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