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

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

[复制链接]

3 L" ^6 k' j/ H& c+ N; c

气象数据可视化主要依靠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("···")


    , X( e. o! z/ m" u3 |1 v$ I% [: n

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


7 [& l  I& Z+ f0 [

绘制中国区域地图

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

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

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

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

2708a4a2d4c2f8f69c367e9c20ffc43a.png

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

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

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

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


6 u# {5 S. a3 \" @

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


  • # I; v! e& _% b, t, ~* P/ c; _
  • . j/ W1 i/ Y7 l' D
  • " Z2 j" B# R6 J3 Z! [+ B) P

  • 7 T# O' x' D5 s0 |5 z, W" m2 L" a. D
  • + q4 ^  t$ \" K5 C; x; v! B
  • * c& y) P  x9 L* p$ R& S

  •   g" J  P- Z& H8 e! a
  • ( _  |3 j" g2 i3 i. E! l% \  D

  • , U, T. C+ i( W% {% j, t; r

  • " V: C# x. A: e/ w  Q3 y: b' |2 ^
  • . k- e, O/ g, W! [5 I, @$ y5 e' n
  • ( t. Z4 x4 Z; M# j* p

  • % h3 P/ k8 A& i! d

  • + L9 o0 h: O* u' M1 N

  • 0 J$ G, U  h, u* h

  • 6 r& J' S! K' s! L8 U$ D3 H4 q" I
  • 4 L: ~1 ]- v3 d
  • % n- v7 J! l5 E
  • % j# d! Z9 u5 X9 `+ b- ^# b

  • , b7 G/ i* w! L) T6 O& G4 J

  • 3 g5 y0 I* `* S$ r- g, F

  • 3 i2 q+ n2 f  P) x

  • $ @; ~% I1 H4 L/ d# M
  • - p) b% t/ \( r( B

  • 1 R: u8 {6 f; x9 [: `
  • 7 ^. l6 u7 \7 E9 U# t5 I) c) ?

  • $ W5 G% f# d" C* g
  • , _1 U3 I; `+ R7 A6 w

  •   B. f4 o9 V0 V/ M
  • 9 b! h: w/ r: Q" }/ t

  •   N) M( N) @. [- E7 w

  • + t/ M6 ]" m) W
  • 6 p1 ~5 C9 ]* D8 p3 [4 b. ^

  • 9 v6 M4 }- B! Q) V# z7 T
    3 l/ b% d$ r) q$ c0 A+ h

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()9 E+ J* G3 E& V0 m! Q" |  d

. k% m/ s6 z( T7 c4 ]* s8 c- Y- ~% o

d52d01fb8ce51133f92387cb24035cb2.png

9 F9 F4 F2 }% L8 W
                               
登录/注册后可看大图

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

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


1 ~/ G0 H, ?) f, B5 c  ?                               
登录/注册后可看大图


8 G9 i2 u3 q' B1 Z1 Z

  • # V$ [6 F& I. n+ P" M8 B8 y7 s

  •   r: S% a, ], |) ~! K( W! c# {: g

  • % ]1 }- A1 z$ `& x( ~" v
  • " F7 ^" A$ c& V3 A" c8 ~2 G

  • , C5 E. \- B+ G5 ]7 Q
  • 2 y+ [; A8 ~2 o2 a# N' R3 T* k  I
  • - p' p" L; o) L- Q

  • 5 K$ v' g7 I: {2 V. J

  • ' O/ _' _/ \/ U8 _: U& N. U
  •   R! o9 U6 Q$ a
  • / Y/ y5 L  d; z1 t0 N/ F

  • 1 P8 s3 k( i: e

  • 9 m. X# Y; U$ t+ x7 {
  • ) t: F) J$ i$ i# L

  • 0 `+ }/ l* z8 E
  • & [# U) I9 |2 s- s) z# i/ p
  • " r8 G% P! e  W% E# s

  • : ^" Y, x! u+ l, c  l8 x# b: a

  • * [, c2 ]0 \$ W/ ^- b3 S/ Z9 P
  • / x$ A. U9 k: t
  • + a- N" g& J: O# ~1 D* z- L
  • 4 y7 C& A& _/ \  F1 i* H/ G

  • 3 N. ]. T9 ^3 L* \) Y7 P
  • 1 K3 U' Y# a5 s8 ]) h
  • 8 Y+ X, }: r$ u3 q$ v

  • 5 Y- t4 W5 g% w& E9 n% d; y! s

  • , S8 |$ {1 j2 Y% P6 j% m3 k4 ]
  • 9 P% j5 Y  ~) R
  • / |; W* s$ h3 [+ v
  • / a( T9 k# g9 b/ h. n% |: O" e& }
  • 2 F1 X/ `" I, M! W

  • $ @- l7 a- ~! K& F

  • ! j* R* L; q3 `. k* |
  • 5 d# m, Z* b0 G: ^0 k6 m  F0 {- |" v

  • & N, P* y6 G; c' M3 p
  • 5 ?& [4 e3 P) x0 l/ y

  • . d) l; L4 z3 x8 \2 z6 g
  • % [/ ^- d* C  G4 {  B, K
  • . l, z! [/ `: F' k  C  D
  • : I& |; ^4 C5 V  {% |

  •   a6 s  [  D) I' Y4 h8 `1 Q- v6 T

  • / m/ A: X" d: ?8 Z
  • & ]3 U( h1 g( ^! K: Y7 N

  • * M- m' r7 t- f' g

  • 1 ^; Q# u+ a. ]
  • ' W4 q7 D1 g. M( {4 Q1 F$ r

  • % V# k5 J! M$ ?
  • " O4 d' ?3 s2 r
  • - S- g/ }1 u' [% x( @. ^
  • ) M' J2 D" w; N- _

  •   M+ n0 o& R" S5 z) l. H. X! c* V. d- [( \# J# B

##绘制有海岸线的中国地图#引库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()) i' r. W' n, H+ d# n0 V/ Z: h

- @* G+ c" p& _! t' V* w, a. g

% \: ?9 `# d/ `: U/ }# \3 R0 x

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

1 U7 V' L. t6 s( I" R( M" I' B
& x* Y7 a6 \( y. {, F
f5c3384582002193c2c6c354a3d26729.png
回复

举报 使用道具

相关帖子

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