收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

[Python] 【气候软件】Python10:绘制标准的中国地图

[复制链接]

; o$ Y2 c5 ?4 @' j2 Y, _

气象数据可视化主要依靠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 W6 U6 \! F7 k5 m1 T+ e

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


: x" }5 B% J7 D) |

绘制中国区域地图

前面python9的文章(Python9:绘制中国/世界地图)关于中国区域地图的绘制方法除例3,主要使用的是pyecharts自带的地图,其中中国区域的地图有问题,所以不采用这种方法。下面根据其他博主大佬的文章(python绘图 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少))进行适当改进,并采用权威的国家标准地图比对无误的地图文件绘制中国区域地图。以一个具体实例完成:

(1)正确的中国国界线,省界线,九段线的绘制;

(2)全球地形图的添加;

(3)中国标准地图文件的添加。

2708a4a2d4c2f8f69c367e9c20ffc43a.png

提前需要下载准备好一些必要文件:

(1)正确的中国行政区划矢量文件;

(2)全球地形图文件(从大佬提供的方式中获取的全球50m分辨率的tif图);

以上的文件可后台发送“中国全球地图文件”获取。


0 \& W3 f' C& C6 i+ m

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

  • " a# D: M, f# P, E1 w

  •   e5 `. e6 j7 ~" @# w
  • + D) P* U: |  a8 u
  •   T0 Z! q4 o1 H# m: {& C

  • 9 n/ }5 b: ]; P8 I: \
  • . w4 w1 d" v6 u& L" O7 }

  • 0 e2 G4 _2 Q5 I+ `% }, `8 ]
  • * K; Y5 e2 v* t$ I+ V% {

  • ! k3 Y! i. a( f: X3 ]  y& r

  • 2 W( e# V, [4 m& A; h

  • . a2 i8 i- q. _6 s( [% o

  • # W% I0 R# D# s* o8 a7 I1 y

  • + y& z4 S) V, S* i' \1 v
  • : p8 j7 ^8 n# l* o+ l

  • 3 f  E2 b2 P+ Q' r+ O5 m9 F

  • , ~9 H4 n7 S+ d  Z" M
  • & r* U+ r! q: a) q$ A
  • 5 i/ X# f' }- @7 h* F: W& K5 F# J) J7 G
  • . q- I0 a  W% X- ]. _! Q: K8 P$ K3 H

  •   b8 }8 c* P1 S' L. b( e
  • " I9 W: }+ O2 y

  • : ?1 A9 O' V5 q+ _" ?
  • $ A( V' i" h2 l

  • - n8 Q4 A! f0 \: b! n

  • 0 H! c- q, ]7 ^% c

  •   g1 J7 t2 f1 }0 O/ c
  • / n: }! u' L$ B5 _( F( l

  • * A" p* z* V( V
  • ; z! {4 Y1 f1 R9 G  P; u
  • # H! i' g3 c) q

  • $ Y* {3 ?+ X5 v0 W+ }3 n# Y/ r: N

  • ' @( K5 G/ M) U& A% X% Y  ?* I

  • ( Q  A4 y9 o! `. R# A3 y# E
  • , V9 ?, f$ @( p7 Y
    9 D. n" H/ h! }+ d) i5 M$ L

importnumpy asnpimportcartopy.crs asccrsimportcartopy.feature ascfeat   ##添加地图其他地理信息所用fromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTER   #添加经纬度所用fromcartopy.io.shapereader importReaderimportmatplotlib.pyplot aspltimportmatplotlib.ticker asmtickerimportwarningsfrommatplotlib.image importimreaddefcreate_map():extent = [70, 140, 0, 60]shp_path = r'./cn_shp\Province_9/'#可后台回复索取(这里很容易出现问题)# --创建画图空间proj = ccrs.PlateCarree()  # 创建坐标系fig = plt.figure(figsize=(6, 8), dpi=350)  # 创建页面ax = fig.subplots(1, 1, subplot_kw={'projection': proj})  # 创建子图# --设置地图属性reader = Reader(shp_path  +  'Province_9.shp')provinces = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='green', facecolor='none')ax.add_feature(provinces, linewidth=0.6)ax.set_extent(extent, crs=proj)ax.set_title('China map', fontsize=5)# --增加高分辨率地形图(需自行下载) #可后台回复索取ax.imshow(imread('./NE1_50M_SR_W.tif'), origin='upper', transform=proj, extent=[-180, 180, -90, 90])returnaxif__name__ == '__main__':warnings.filterwarnings('ignore')ax = create_map()plt.show()
, a1 h, l( a; i1 [( L- J

- I0 D  p2 y4 i+ ~

d52d01fb8ce51133f92387cb24035cb2.png


3 G* M: O& X/ j% Q3 V7 j+ M& k                               
登录/注册后可看大图

上篇文章(Python9:绘制中国/世界地图)的例3:绘制中国区域地图,包含海岸线

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


% U$ N( j8 |' ?" C- H& b                               
登录/注册后可看大图

) b1 ?9 u4 F  q

  •   F; C. q' {9 K3 D* [9 n3 N1 ~
  • - f% G" l5 O! o8 p8 b7 j. ?; A

  • * M2 x/ L. i$ d' Q& L# @

  • 9 S- {8 f# G( H9 J
  • 6 h. {1 j4 S7 T5 [

  • % z$ w( I. [# ^* G! Z/ ^- Z6 x6 l

  • 9 |+ k3 v; Q+ S6 H, J  J

  • & d6 h8 u  G4 m3 u/ U  }
  • 1 U9 |0 C9 n+ Z
  •   B: o+ I6 L* H1 b
  • 8 {5 }3 K4 e# x* N4 D, O) b' V

  • % O/ h. L$ O- j- f1 S! q
  • 8 V) T0 X. x8 n; P
  • % H, u  o1 ?5 X$ }* p: n* j! G" E
  • $ d5 K" R. B% ]+ K- n, z
  • " U+ p7 B( n1 p5 ^% T0 I' l
  • 2 l, L: `9 A5 M$ Q" T

  • ! g2 e  V; Z8 D9 g1 Y% z' K

  • ( W# C0 |! ~. C9 j8 G; W
  • 8 \' e; Z3 V. \' s' h

  • # ?1 w, M( a" X% ~3 B+ B; U

  • ' A, e/ W8 A$ j! W' e& \
  • ( s5 j9 X* X/ n+ B

  • 7 @5 G( F% B% V4 R' q9 i' d

  • 8 W: r, r- ^) ?7 R$ J8 L
  •   S. T! J8 U- E" ]% `9 f8 F

  • 1 S0 D2 C: p9 @* T0 e

  • . m, h: `. O4 X

  • 3 A, [3 _% Q0 w, ~
  • ( t8 A4 G* H# E

  • * K! S. l9 R- a& K6 P" T
  • 7 T# a: T/ L! j( T5 p7 J4 t
  • . v" k2 p. O& [- U1 c8 f

  • 8 f1 C* J5 }$ Z% l. ?% j

  • : ]1 C- T# H- q  R0 k4 X
  • 1 a( Y$ H7 N* g6 R  Z  f) e& B) j

  • - ^4 V1 [$ r3 _1 r" w! c) g
  • 9 E7 i$ h, k- v6 y; {' S2 s

  • - Z8 c: a7 t; [. ]. S: ]" a7 W9 I

  • " w) s: u2 _4 R( t7 Z& S# u4 x7 W

  • 6 r+ O; }4 p% h3 S1 n

  •   H6 @/ Q1 O1 C) D4 k4 E- O$ @
  • ! L% u" H4 C' [! b/ t7 \" [1 B

  • - X" r% O1 b1 D/ f7 e

  • 5 K5 _3 r6 s& Z$ Z# Z3 }
  • 6 V6 s" |6 {* N3 ?4 S" W* U- f
  • 6 Y, T  w* S3 w) X

  • 3 H2 n" h5 g( d% P

  • : M; ^; W* f. n# N) }
  • " ^; s; i; _0 g6 H
  • $ Z6 W4 Z9 i' D8 ~9 E
    ) z8 `5 z, U2 f" r0 u& G# N# t$ 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()" v) J  A8 ?0 A; C


& U0 @8 `( i/ ?% o( J9 P; y
' Z. R7 _, f8 W

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


' H* A' j6 `- U
% s( i6 q) R5 q7 r
f5c3384582002193c2c6c354a3d26729.png
回复

举报 使用道具

相关帖子

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