示例#1
0
def draw_point_fcst(t2m=None,
                    u10m=None,
                    v10m=None,
                    rn=None,
                    model=None,
                    output_dir=None,
                    points=None,
                    extra_info=None):

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
    plt.rcParams['axes.unicode_minus'] = False  # 步骤二(解决坐标轴负数的负号显示问题)
    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')

    initTime = pd.to_datetime(str(
        t2m['forecast_reference_time'].values)).replace(
            tzinfo=None).to_pydatetime()

    # draw figure
    fig = plt.figure(figsize=(16, 4.5))
    ax_t2m = HostAxes(fig, [0.1, 0.28, .8, .62])
    ax_rn = ParasiteAxes(ax_t2m, sharex=ax_t2m)
    #其他信息

    #append axes
    ax_t2m.parasites.append(ax_rn)

    #invisible right axis of ax
    ax_t2m.axis['right'].set_visible(False)
    ax_t2m.axis['right'].set_visible(False)
    ax_rn.axis['right'].set_visible(True)
    ax_rn.axis['right'].major_ticklabels.set_visible(True)
    ax_rn.axis['right'].label.set_visible(True)
    #set label for axis
    ax_t2m.set_ylabel('温度($^\circ$C)', fontsize=100)
    ax_rn.set_ylabel('降水(mm)', fontsize=100)
    fig.add_axes(ax_t2m)

    # draw main figure
    #2米温度——————————————————————————————————————
    if (model == '中央台指导'):
        model = '智能网格'
    utl.add_public_title_sta(title=model + '预报 ' + extra_info['point_name'] +
                             ' [' + str(points['lon'][0]) + ',' +
                             str(points['lat'][0]) + ']',
                             initTime=initTime,
                             fontsize=21)
    for ifhour in t2m['forecast_period'].values:
        if (ifhour == t2m['forecast_period'].values[0]):
            t2m_t = (initTime + timedelta(hours=ifhour))
        else:
            t2m_t = np.append(t2m_t, (initTime + timedelta(hours=ifhour)))

    curve_t2m = ax_t2m.plot(t2m_t,
                            np.squeeze(t2m['data'].values),
                            c='#FF6600',
                            linewidth=3,
                            label='2m温度')
    ax_t2m.set_xlim(t2m_t[0], t2m_t[-1])
    ax_t2m.set_ylim(
        math.floor(t2m['data'].values.min() / 5) * 5 - 2,
        math.ceil(t2m['data'].values.max() / 5) * 5)
    #降水——————————————————————————————————————
    for ifhour in rn['forecast_period'].values:
        if (ifhour == rn['forecast_period'].values[0]):
            rn_t = (initTime + timedelta(hours=ifhour))
        else:
            rn_t = np.append(rn_t, (initTime + timedelta(hours=ifhour)))
    mask = (rn['data'] < 999)
    rn = rn['data'].where(mask)
    ax_rn.bar(rn_t,
              np.squeeze(rn.values),
              width=0.1,
              color='#00008B',
              label=str(
                  int(rn['forecast_period'].values[1] -
                      rn['forecast_period'].values[0])) + '小时降水',
              alpha=0.5)
    #curve_rn=ax_rn.plot(rn_t, np.squeeze(rn['data'].values), c='#40C4FF',linewidth=3)

    ax_rn.set_ylim(0, np.nanmax(np.append(10, np.squeeze(rn.values))))
    ###

    xaxis_intaval = mpl.dates.HourLocator(byhour=(8, 20))  #单位是小时
    ax_t2m.xaxis.set_major_locator(xaxis_intaval)
    # add legend
    ax_t2m.legend(fontsize=15, loc='upper right')
    ax_t2m.tick_params(length=10)
    ax_t2m.tick_params(axis='y', labelsize=100)
    ax_t2m.set_xticklabels([' '])
    miloc = mpl.dates.HourLocator(byhour=(8, 11, 14, 17, 20, 23, 2, 5))  #单位是小时
    ax_t2m.xaxis.set_minor_locator(miloc)
    yminorLocator = MultipleLocator(1)  #将此y轴次刻度标签设置为1的倍数
    ax_t2m.yaxis.set_minor_locator(yminorLocator)
    ymajorLocator = MultipleLocator(5)  #将此y轴次刻度标签设置为1的倍数
    ax_t2m.yaxis.set_major_locator(ymajorLocator)

    ax_t2m.grid(axis='x', which='minor', ls='--')
    ax_t2m.axis['left'].label.set_fontsize(15)
    ax_t2m.axis['left'].major_ticklabels.set_fontsize(15)
    ax_rn.axis['right'].label.set_fontsize(15)
    ax_rn.axis['right'].major_ticklabels.set_fontsize(15)
    #10米风——————————————————————————————————————
    ax_uv = plt.axes([0.1, 0.16, .8, .12])
    for ifhour in u10m['forecast_period'].values:
        if (ifhour == u10m['forecast_period'].values[0]):
            uv_t = (initTime + timedelta(hours=ifhour))
        else:
            uv_t = np.append(uv_t, (initTime + timedelta(hours=ifhour)))

    wsp = (u10m**2 + v10m**2)**0.5
    #curve_uv=ax_uv.plot(uv_t, np.squeeze(wsp['data'].values), c='#696969',linewidth=3,label='10m风')

    ax_uv.barbs(uv_t,
                np.zeros(len(uv_t)),
                np.squeeze(u10m['data'].values),
                np.squeeze(v10m['data'].values),
                fill_empty=True,
                color='gray',
                barb_increments={
                    'half': 2,
                    'full': 4,
                    'flag': 20
                },
                length=5.8,
                linewidth=1.5,
                zorder=100)
    ax_uv.set_ylim(-1, 1)
    ax_uv.set_xlim(uv_t[0], uv_t[-1])
    #ax_uv.axis('off')
    ax_uv.set_yticklabels([' '])
    #logo
    utl.add_logo_extra_in_axes(pos=[0.87, 0.00, .1, .1],
                               which='nmc',
                               size='Xlarge')

    #开启自适应
    xaxis_intaval = mpl.dates.HourLocator(byhour=(8, 20))  #单位是小时
    ax_uv.xaxis.set_major_locator(xaxis_intaval)
    ax_uv.tick_params(length=5, axis='x')
    ax_uv.tick_params(length=0, axis='y')
    miloc = mpl.dates.HourLocator(byhour=(8, 11, 14, 17, 20, 23, 2, 5))  #单位是小时
    ax_uv.xaxis.set_minor_locator(miloc)
    ax_uv.grid(axis='x', which='both', ls='--')
    ax_uv.set_ylabel('10m风', fontsize=15)

    xstklbls = mpl.dates.DateFormatter('%m月%d日%H时')
    for label in ax_uv.get_xticklabels():
        label.set_rotation(30)
        label.set_horizontalalignment('center')
    ax_uv.tick_params(axis='x', labelsize=15)

    #出图——————————————————————————————————————————————————————————

    if (output_dir != None):
        isExists = os.path.exists(output_dir)
        if not isExists:
            os.makedirs(output_dir)

        output_dir2 = output_dir + model + '_起报时间_' + initTime.strftime(
            "%Y年%m月%d日%H时") + '/'
        if (os.path.exists(output_dir2) == False):
            os.makedirs(output_dir2)

        plt.savefig(output_dir2 + model + '_' + extra_info['point_name'] +
                    '_' + extra_info['output_head_name'] +
                    initTime.strftime("%Y%m%d%H") + '00' +
                    extra_info['output_tail_name'] + '.jpg',
                    dpi=200,
                    bbox_inches='tight')
    else:
        plt.show()
示例#2
0
host = HostAxes(fig1, [0.15, 0.1, 0.65, 0.8])
par1 = ParasiteAxes(host, sharex=host)
host.parasites.append(par1)

host.axis["right"].set_visible(False)
par1.axis["right"].set_visible(True)

par1.axis["right"].major_ticklabels.set_visible(True)
par1.axis["right"].label.set_visible(True)
fig1.add_axes(host)

host.set_xlim(np.pi / 2, np.pi)
host.set_ylim(0.29, 0.61)
host.set_xticks([1.57, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.1415])
host.set_xticklabels(
    ['$\\pi/2$', '1.8', '2.0', '2.2', '2.4', '2.6', '2.8', '3.0', '$\\pi$'])

host.set_xlabel("$\\theta_c$")
host.set_ylabel("$\\theta_b^*$")
par1.set_ylabel("min$_{\\theta_b} \\varepsilon$ $(\\times 10^{-3})$")

p1, = host.plot(C[0, :],
                X[Z.argmin(axis=0), 0],
                label="$\\theta_b^*$",
                color='#1f77b4')
p2, = par1.plot(C[0, :],
                Z.min(axis=0) * 1000,
                label="min$_{\\theta_b} \\varepsilon$",
                color='#e6550d')
par1.set_ylim(0, 2.5)