- 积分
- 4630
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2013-3-20
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 晋陵小生 于 2019-4-3 11:02 编辑
@平流层的萝卜 给出的python完美白化脚本非常好用(详见:[经验总结] Python完美白化)
可以很好地去除目标区域以外的等值线和填色。但是区域外的线标签无法去除,如:
这里在平流层的萝卜的maskout程序中多添加了一个可选参数
def shp2clip(originfig,ax,m,shpfile,region, clabel = None)
加入对应的处理语句:- if clabel:
- clip_map_shapely = ShapelyPolygon(vertices)
- for text_object in clabel:
- if not clip_map_shapely.contains(ShapelyPoint(text_object.get_position())):
- text_object.set_visible(False)
复制代码
对应绘图语句:
- ###绘制填色图和色标
- cf = m.contourf(x,y,pcp_grid, levels=levels, cmap=cmaps.CBR_wet)
- cbar = m.colorbar(cf,location='right',format='%d',size=0.3,
- ticks=np.linspace(200,1100,19),label='毫米')
- ###绘制等值线图和标签
- contours = m.contour(x,y,pcp_grid, levels=levels,colors="black")
- cn_label = plt.clabel(contours,inline=1,fontsize=10,fmt="%i")
- #####擦除区域外的填色和等值线
- clip = maskout.shp2clip(cf,ax,m,china_border,["吉林省","黑龙江省","辽宁省","内蒙古自治区"])
- clip = maskout.shp2clip(contours,ax,m,china_border,["吉林省","黑龙江省","辽宁省","内蒙古自治区"],clabel=cn_label)
复制代码
最终效果图:
程序中的判断标识我也做了修改,大家可以根据自己用的shp文件进行调整(if shape_rec.record[7] in region:)
##########分隔符:2019/3/17更新###########
感谢@janemars提出白化风矢量的需求。风场返回的是一个元组,并且元素中包含有“set_clip_path”方法,与填色图的白化方法类似。
在shp2clip函数中增加一个可选参数,判断是否为矢量图
- def shp2clip(originfig,ax,m,shpfile,region, clabel = None, vcplot = False):
复制代码 修改contour白化部分的脚本
- if vcplot:
- for ivec in originfig:
- ivec.set_clip_path(clip)
- else:
- for contour in originfig.collections:
- contour.set_clip_path(clip)
复制代码 对应绘图脚本(修改自wrf-python官方文档例子 Horizontal Interpolation to a Pressure Level)- from netCDF4 import Dataset
- import numpy as np
- import matplotlib.pyplot as plt
- from matplotlib.cm import get_cmap
- import maskout,sys
- from wrf import getvar, interplevel, to_np, get_basemap, latlon_coords
- # Open the NetCDF file
- ncfile = Dataset("wrfout_d01_2017-01-26_06_00_00")
- # Extract the pressure, geopotential height, and wind variables
- p = getvar(ncfile, "pressure")
- z = getvar(ncfile, "z", units="dm")
- ua = getvar(ncfile, "ua", units="kt")
- va = getvar(ncfile, "va", units="kt")
- wspd = getvar(ncfile, "wspd_wdir", units="kts")[0,:]
- # Interpolate geopotential height, u, and v winds to 500 hPa
- ht_500 = interplevel(z, p, 500)
- u_500 = interplevel(ua, p, 500)
- v_500 = interplevel(va, p, 500)
- wspd_500 = interplevel(wspd, p, 500)
- # Get the lat/lon coordinates
- lats, lons = latlon_coords(ht_500)
- # Get the basemap object
- bm = get_basemap(ht_500)
- # Create the figure
- fig = plt.figure(figsize=(12,9))
- ax = plt.axes()
- # Convert the lat/lon coordinates to x/y coordinates in the projection space
- x, y = bm(to_np(lons), to_np(lats))
- # Add the 500 hPa wind barbs, only plotting every 125th data point.
- fbar = bm.barbs(x[::100,::100], y[::100,::100], to_np(u_500[::100, ::100]),
- to_np(v_500[::100, ::100]), length=6)
- china_border = r"xxx/Export_Output_2"
- bm.readshapefile(china_border, name = "china" ,drawbounds=True, color = 'k',linewidth=1.)
- clip = maskout.shp2clip(fbar,ax,bm,china_border,["吉林省","黑龙江省","辽宁省","内蒙古自治区"],vcplot=True)
- plt.title("500 MB Height (dm), Wind Speed (kt), Barbs (kt)")
- plt.show()
复制代码
对比图:
######################
若风矢量绘图返回的不是元组(可以print(fbar)查看),则maskout中的对应代码可以改为
- if vcplot:
- originfig.set_clip_path(clip)
- else:
- for contour in originfig.collections:
- contour.set_clip_path(clip)
复制代码 刚接触python不久,不清楚为什么会出现不同的返回值,大家有知道的可以帮忙补充一下,谢谢。
##########################################
############2019/4/1更新################################################################
判断风矢量是否可迭代
- if vcplot:
- if isinstance(originfig,Iterable):
- for ivec in originfig:
- ivec.set_clip_path(clip)
- else:
- originfig.set_clip_path(clip)
- else:
- for contour in originfig.collections:
- contour.set_clip_path(clip)
复制代码
白化语句:
- clip = maskout.shp2clip(fbar,ax,bm,china_border,["吉林省","黑龙江省","辽宁省","内蒙古自治区"], vcplot=True) #白化风矢量场
- clip = maskout.shp2clip(contour1,ax,bm,china_border,["吉林省","黑龙江省","辽宁省","内蒙古自治区"]) #白化填色图(无标签)
- clip = maskout.shp2clip(contour2,ax,bm,china_border,["吉林省","黑龙江省","辽宁省","内蒙古自治区"],clabel=True) #白化填色图(有标签)
复制代码
最新白化脚本:
maskout.py
(3.17 KB, 下载次数: 951)
|
评分
-
查看全部评分
|