示例#1
0
def lower_plot(df, p1):
    # configure wheelzoom tool
    wz = WheelZoomTool()
    wz.maintain_focus = False
    wz.dimensions = 'width'
    wz.zoom_on_axis = True

    p2_tools = 'box_zoom,pan,save, hover, reset'
    p2 = figure(width=fwidth,
                height=fhgt + 35,
                x_axis_type="datetime",
                tools=p2_tools,
                x_range=p1.x_range)
    p2.add_tools(wz)
    p2.min_border_top = fborder
    p2.min_border_bottom = fborder

    # pressure
    h_line = p2.line(x='time',
                     y='p',
                     source=df,
                     line_width=4,
                     color=pcol,
                     legend='Pressure')
    p2.y_range = Range1d(df['p'].min() - 5, df['p'].max() + 5)
    p2.yaxis.axis_label = 'Pressure (hPa)'

    # wind
    p2.extra_y_ranges = {
        "winddir": Range1d(start=0, end=360),
        "windspd": Range1d(start=0, end=df['ff'].max() + df['ff'].max() * 0.1)
    }

    p2.add_layout(
        LinearAxis(y_range_name='winddir',
                   ticker=SingleIntervalTicker(interval=45,
                                               num_minor_ticks=3)), 'right')
    p2.add_layout(LinearAxis(y_range_name="windspd"), 'right')
    p2.circle(x='time',
              y='dd',
              source=df,
              line_width=4,
              color='black',
              y_range_name='winddir',
              legend='Wind Direction')
    p2.line(x='time',
            y='ff',
            source=df,
            line_width=4,
            color=ffcol,
            y_range_name='windspd',
            legend='Wind speed')

    p2.yaxis[0].axis_label = 'Pressure (hPa)'
    p2.yaxis[1].axis_label = 'Wind direction (°)'
    p2.yaxis[2].axis_label = 'Wind speed (m s⁻¹)'
    p2.xaxis[0].axis_label = 'Time (UTC)'

    p2.yaxis[2].major_label_text_color = ffcol
    p2.yaxis[2].axis_label_text_color = ffcol
    p2.yaxis[2].minor_tick_line_color = ffcol
    p2.yaxis[2].major_tick_line_color = ffcol
    p2.yaxis[2].axis_line_color = ffcol
    p2.yaxis[0].major_label_text_color = pcol
    p2.yaxis[0].axis_label_text_color = pcol
    p2.yaxis[0].minor_tick_line_color = pcol
    p2.yaxis[0].major_tick_line_color = pcol
    p2.yaxis[0].axis_line_color = pcol

    # hover
    hover_p2 = p2.select(dict(type=HoverTool))
    hover_p2.tooltips = [("Timestamp", "@time{%d %b %Y %H:%M} UTC"),
                         ('Pressure', '@p{f0.0} hPa'),
                         ('Winddirection', '@dd{int} °'),
                         ('Windspeed', '@ff{f0.0} (m s⁻¹)')]
    hover_p2.formatters = {"time": "datetime"}
    hover_p2.mode = 'vline'
    hover_p2.renderers = [h_line]  #### to fix if missing value

    # legend
    p2.legend.location = (0, 15)  # above plot
    p2.legend.orientation = 'horizontal'
    p2.legend.click_policy = "hide"
    p2.legend.label_text_font_size = font_size_legend
    p2.add_layout(p2.legend[0], 'above')

    # font style
    p2 = set_font_style_axis(p2)

    #set boarders for zoom
    p2.x_range.max_interval = timedelta(7.5)
    return p2
示例#2
0
def upper_plot(df):
    # configure wheelzoom tool
    wz = WheelZoomTool()
    wz.maintain_focus = False
    wz.dimensions = 'width'
    wz.zoom_on_axis = True

    p1_tools = 'box_zoom,pan,save, hover, reset'  #, xwheel_zoom' # zoom bounds auto?
    p1 = figure(width=fwidth,
                height=fhgt,
                x_axis_type="datetime",
                tools=p1_tools)
    p1.x_range = Range1d(start=df.index[-1] - timedelta(days=1),
                         end=df.index[-1],
                         bounds=(df.index[0], df.index[-1]))
    p1.add_tools(wz)
    p1.min_border_top = fborder
    p1.min_border_bottom = fborder

    # hover for temp, dew point and rel. humidity
    hover_p1 = p1.select(dict(type=HoverTool))
    hover_p1.tooltips = [("Timestamp", "@time{%d %b %Y %H:%M} UTC"),
                         ('Temperature', "@tl{f0.0} °C")]  #
    if 'tp' in df.columns:
        hover_p1[0].tooltips.append(('Dewpoint', '@tp{f0.0} °C'))
    else:

        hover_p1[0].tooltips.append(('Relative Humidity', '@rf{f0.0} %'))

    # sunshine duration
    if 'so' in df.columns:
        if ssdcum:
            varso = 'ssd_cum'  # 'ssd_cum' or 'so'
            unitso = 'h'
        else:
            varso = 'so'  # 'ssd_cum' or 'so'
            unitso = 'min'

        if ssdcum and df[varso].sum(
        ) > 0:  #axis would disappear when there was no rain measured
            p1.extra_y_ranges[varso] = Range1d(start=0,
                                               end=(df[varso].max() +
                                                    df[varso].max() * 0.1))
        else:
            p1.extra_y_ranges[varso] = Range1d(start=0, end=10)
        p1.add_layout(LinearAxis(y_range_name=varso), 'right')

        if ssdcum:
            p1.line(x='time',
                    y=varso,
                    source=df,
                    line_width=4,
                    color=socol,
                    y_range_name=varso,
                    legend='Sunshine duration (24h)')
        else:
            p1.vbar(top=varso,
                    x='time',
                    source=df,
                    width=get_width(),
                    fill_color=socol,
                    line_alpha=0,
                    line_width=0,
                    fill_alpha=0.5,
                    y_range_name=varso,
                    legend='Sunshine duration')

        p1.yaxis[1].axis_label = 'Sunshine duration (' + unitso + ')'
        p1.yaxis[1].axis_label_text_font_size = font_size_label

        p1.yaxis[1].major_label_text_color = socol
        p1.yaxis[1].axis_label_text_color = socol
        p1.yaxis[1].minor_tick_line_color = socol
        p1.yaxis[1].major_tick_line_color = socol
        p1.yaxis[1].axis_line_color = socol
        hover_p1[0].tooltips.append(
            ('Sunshine duration', '@so{int} min per 10 min'))
        hover_p1[0].tooltips.append(
            ('Cumulated sunshine duration', '@ssd_cum{f0.0} h'))

    # temperature
    h_line = p1.line(x='time',
                     y='tl',
                     source=df,
                     line_width=4,
                     color=tcol,
                     legend='Temperature')
    p1.yaxis[0].axis_label = 'Temperature (°C)'
    p1.yaxis[0].major_label_text_color = tcol
    p1.yaxis[0].axis_label_text_color = tcol
    p1.yaxis[0].minor_tick_line_color = tcol
    p1.yaxis[0].major_tick_line_color = tcol
    p1.yaxis[0].axis_line_color = tcol
    p1.yaxis[0].axis_label_text_font_style = "normal"

    # dew point
    if 'tp' in df.columns:
        p1.y_range = Range1d(df['tp'].min() - 2, df['tl'].max() + 2)
        p1.line(x='time',
                y='tp',
                source=df,
                line_width=4,
                color=hcol,
                legend='Dewpoint')
    else:
        # relative humidity
        p1.y_range = Range1d(df['tl'].min() - 2, df['tl'].max() + 2)
        p1.extra_y_ranges = {'rf': Range1d(start=0, end=100)}
        p1.add_layout(LinearAxis(y_range_name='rf'), 'right')
        p1.line(x='time',
                y='rf',
                source=df,
                line_width=4,
                color=hcol,
                legend='Relative Humidity',
                y_range_name='rf')
        p1.yaxis[1].axis_label = 'Relative humidity (%)'
        p1.yaxis[1].major_label_text_color = hcol
        p1.yaxis[1].axis_label_text_color = hcol
        p1.yaxis[1].minor_tick_line_color = hcol
        p1.yaxis[1].major_tick_line_color = hcol
        p1.yaxis[1].axis_line_color = hcol

    # precipitation (3 h sums)
    if 'rrsum' in df.columns:
        if df['rrsum'].sum(
        ) > 0:  #axis would disappear when there was no rain measured
            p1.extra_y_ranges['rrsum'] = Range1d(start=0,
                                                 end=(df['rrsum'].max() * 2))
        else:
            p1.extra_y_ranges['rrsum'] = Range1d(start=0, end=10)
        p1.add_layout(LinearAxis(y_range_name='rrsum'), 'right')

        timeoffset = 0  # timeoffset: dodge to correctly bin bar in time
        if rrsum_period > 10: timeoffset = -60 * rrsum_period / 2 * 1000
        rr = p1.vbar(x=dodge('time', timeoffset, range=p1.x_range),
                     top='rrsum',
                     width=get_width() * rrsum_period / 10,
                     source=df,
                     fill_color=pcol,
                     line_alpha=0,
                     line_width=0,
                     fill_alpha=0.5,
                     legend='Precipitation',
                     y_range_name='rrsum')
        rr.level = 'underlay'
        if rrsum_period >= 60:
            rr_period = str(round_dec(rrsum_period / 60, decimals=1)) + ' h'
        else:
            rr_period = str(rrsum_period) + ' min'
        hover_p1[0].tooltips.append(
            ('Precipitation', '@rrsumm{f0.0} mm in ' + rr_period))
        hover_p1[0].tooltips.append(
            ('Cumulated precipitation', '@rr_cum{f0.0} mm'))

        p1.yaxis[2].major_label_text_color = pcol
        p1.yaxis[2].axis_label_text_color = pcol
        p1.yaxis[2].minor_tick_line_color = pcol
        p1.yaxis[2].major_tick_line_color = pcol
        p1.yaxis[2].axis_line_color = pcol
        p1.yaxis[2].axis_label = 'Precipitation (mm)'

    # hover
    hover_p1.formatters = {"time": "datetime"}
    hover_p1.mode = 'vline'
    hover_p1.renderers = [h_line]  #### to fix if missing value

    # legend
    p1.legend.location = (0, 15)  # above plot
    p1.legend.orientation = 'horizontal'
    p1.legend.click_policy = "hide"
    p1.legend.label_text_font_size = font_size_legend
    p1.add_layout(p1.legend[0], 'above')

    # font style
    p1 = set_font_style_axis(p1)

    return p1