def dT2m_pcolormesh(ax, x, y, z, cmap=utl.linearized_ncl_cmap('hotcold_18lev'), vmin=-16, vmax=16, transform=ccrs.PlateCarree(), **kwargs): img = ax.pcolormesh(x, y, z, cmap=cmap, transform=transform, vmin=vmin, vmax=vmax, **kwargs) return img
def ulj_contourf(ax, x, y, z, cmap=utl.linearized_ncl_cmap('MPL_Oranges'), levels=np.arange(30, 80, 2), alpha=0.8, transform=ccrs.PlateCarree(), **kwargs): z[z < levels[0]] = np.nan img = ax.contourf(x, y, z, cmap=cmap, levels=levels, transform=transform, extend='max', alpha=alpha, **kwargs) return img
def dT2m_contour(ax, x, y, z, cmap=utl.linearized_ncl_cmap('BlRe'), levels=[-16, -12, -10, -8, -6, 6, 8, 10, 12, 16], vmin=-16, vmax=16, alpha=0.5, transform=ccrs.PlateCarree(), **kwargs): img = ax.contour(x, y, z, levels=levels, cmap=cmap, transform=transform, alpha=alpha, vmin=vmin, vmax=vmax, **kwargs) return img
def draw_dT_2m(dT_2m=None, T_type='Tmx', map_extent=(50, 150, 0, 65), regrid_shape=20, add_china=True, city=True, south_China_sea=True, output_dir=None, Global=False): # set font plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体) plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题) # set figure fig = plt.figure(figsize=(16, 9)) if (Global == True): plotcrs = ccrs.Robinson(central_longitude=115.) else: plotcrs = ccrs.AlbersEqualArea( central_latitude=(map_extent[2] + map_extent[3]) / 2., central_longitude=(map_extent[0] + map_extent[1]) / 2., standard_parallels=[30., 60.]) ax = plt.axes([0.01, 0.1, .98, .84], projection=plotcrs) datacrs = ccrs.PlateCarree() map_extent2 = utl.adjust_map_ratio(ax, map_extent=map_extent, datacrs=datacrs) # define return plots plots = {} if dT_2m is not None: x, y = np.meshgrid(dT_2m['lon'], dT_2m['lat']) z = np.squeeze(dT_2m['data']) cmap = utl.linearized_ncl_cmap('hotcold_18lev') plots['T_2m'] = ax.pcolormesh(x, y, z, cmap=cmap, zorder=1, transform=datacrs, alpha=1, vmin=-16, vmax=16) z = gaussian_filter(z, 5) cmap = utl.linearized_ncl_cmap('BlRe') clevs = [-16, -12, -10, -8, -6, 6, 8, 10, 12, 16] plots['T_2m_contour'] = ax.contour(x, y, z, levels=clevs, cmap=cmap, zorder=3, transform=datacrs, alpha=0.5, vmin=-16, vmax=16) clev_colors = [] for iclev in clevs: per_color = utl.get_part_clev_and_cmap(cmap=cmap, clev_range=[-16, 16], clev_slt=iclev) clev_colors.append(np.squeeze(per_color[:])) cl = plt.clabel(plots['T_2m_contour'], inline=1, fontsize=15, fmt='%i', colors=clev_colors) for t in cl: t.set_path_effects([ path_effects.Stroke(linewidth=3, foreground='#D9D9D9'), path_effects.Normal() ]) ''' z=gaussian_filter(z,5) plots['T_2m_zero'] = ax.contour( x, y, z, levels=[0], colors='#232B99', linewidths=2, transform=datacrs, zorder=2) cl_zero=plt.clabel(plots['T_2m_zero'], inline=1, fontsize=15, fmt='%i',colors='#232B99') for t in cl_zero: t.set_path_effects([path_effects.Stroke(linewidth=3, foreground='white'), path_effects.Normal()]) plots['T_2m_35'] = ax.contour( x, y, z, levels=[35,37,40], colors=['#FF8F00','#FF6200','#FF0000'], linewidths=2, transform=datacrs, zorder=2) cl_35=plt.clabel(plots['T_2m_35'], inline=1, fontsize=15, fmt='%i',colors='#FF0000') for t in cl_35: t.set_path_effects([path_effects.Stroke(linewidth=3, foreground='white'), path_effects.Normal()]) ''' plt.title('[' + dT_2m.attrs['model'] + ']' + ' ' + dT_2m.attrs['title'], loc='left', fontsize=30) ax.add_feature(cfeature.OCEAN) utl.add_china_map_2cartopy_public(ax, name='coastline', edgecolor='gray', lw=0.8, zorder=4, alpha=0.5) if add_china: utl.add_china_map_2cartopy_public(ax, name='province', edgecolor='gray', lw=0.5, zorder=4) utl.add_china_map_2cartopy_public(ax, name='nation', edgecolor='black', lw=0.8, zorder=4) utl.add_china_map_2cartopy_public(ax, name='river', edgecolor='#74b9ff', lw=0.8, zorder=4, alpha=0.5) # grid lines gl = ax.gridlines(crs=datacrs, linewidth=2, color='gray', alpha=0.5, linestyle='--', zorder=5) gl.xlocator = mpl.ticker.FixedLocator(np.arange(0, 360, 15)) gl.ylocator = mpl.ticker.FixedLocator(np.arange(-90, 90, 15)) utl.add_cartopy_background(ax, name='RD') l, b, w, h = ax.get_position().bounds #forecast information bax = plt.axes([l, b + h - 0.1, .25, .1], facecolor='#FFFFFFCC') bax.set_yticks([]) bax.set_xticks([]) bax.axis([0, 10, 0, 10]) initTime = pd.to_datetime( str(dT_2m.coords['forecast_reference_time'].values)).replace( tzinfo=None).to_pydatetime() fcst_time = initTime + timedelta( hours=dT_2m.coords['forecast_period'].values[0]) #发布时间 if (sys.platform[0:3] == 'lin'): locale.setlocale(locale.LC_CTYPE, 'zh_CN.utf8') if (sys.platform[0:3] == 'win'): locale.setlocale(locale.LC_CTYPE, 'chinese') plt.text(2.5, 7.5, '起报时间: ' + initTime.strftime("%Y年%m月%d日%H时"), size=15) plt.text(2.5, 5, '预报时间: ' + fcst_time.strftime("%Y年%m月%d日%H时"), size=15) plt.text(2.5, 2.5, '预报时效: ' + str(int(dT_2m.coords['forecast_period'].values[0])) + '小时', size=15) plt.text(2.5, 0.5, 'www.nmc.cn', size=15) # add color bar if (dT_2m != None): cax = plt.axes([l, b - 0.04, w, .02]) cb = plt.colorbar( plots['T_2m'], cax=cax, orientation='horizontal', extend='both', ticks=[-16, -12, -10, -8, -6, -4, 0, 4, 6, 8, 10, 12, 16]) cb.ax.tick_params(labelsize='x-large') cb.set_label(u'°C', size=20) # add south China sea if south_China_sea: utl.add_south_China_sea(pos=[l + w - 0.091, b, .1, .2]) small_city = False #if(map_extent2[1]-map_extent2[0] < 25): # small_city=True #if city: utl.add_city_and_number_on_map(ax, data=dT_2m, map_extent=map_extent2, transform=datacrs, zorder=6, size=13, small_city=small_city) utl.add_logo_extra_in_axes(pos=[l - 0.02, b + h - 0.1, .1, .1], which='nmc', size='Xlarge') # show figure if (output_dir != None): plt.savefig(output_dir + '最低温度_预报_' + '起报时间_' + initTime.strftime("%Y年%m月%d日%H时") + '预报时效_' + str(dT_2m.coords['forecast_period'].values[0]) + '小时' + '.png', dpi=200, bbox_inches='tight') plt.close() if (output_dir == None): plt.show()