def _display_timeline_dict(data: dict, **kwargs) -> figure:
    "\n    Display a timeline of events.\n\n    Parameters\n    ----------\n    data : dict\n        Data points to plot on the timeline.\n            Need to contain:\n                Key - Name of data type to be displayed in legend\n                Value - dict of data containing:\n                    data : pd.DataFrame\n                        Data to plot\n                    time_column : str\n                        Name of the timestamp column\n                    source_columns : list\n                        List of source columns to use in tooltips\n                    color: str\n                        Color of datapoints for this data\n    Other Parameters\n    ----------------\n    ref_time : datetime, optional\n        Input reference line to display (the default is None)\n    title : str, optional\n        Title to display (the default is None)\n    time_column : str, optional\n        Name of the timestamp column\n        (the default is 'TimeGenerated')\n    legend: str, optional\n        Where to position the legend\n        None, left, right or inline (default is None)\n    yaxis : bool, optional\n        Whether to show the yaxis and labels\n    range_tool : bool, optional\n        Show the the range slider tool (default is True)\n    source_columns : list, optional\n        List of default source columns to use in tooltips\n        (the default is None)\n    height : int, optional\n        The height of the plot figure\n        (the default is auto-calculated height)\n    width : int, optional\n        The width of the plot figure (the default is 900)\n\n    Returns\n    -------\n    figure\n        The bokeh plot figure.\n\n    "
    reset_output()
    output_notebook()
    height: int = kwargs.pop('height', None)
    width: int = kwargs.pop('width', 900)
    ref_time: Any = kwargs.pop('ref_time', None)
    ref_label: str = kwargs.pop('ref_label', None)
    title: str = kwargs.pop('title', None)
    legend_pos: str = kwargs.pop('legend', None)
    show_yaxis: bool = kwargs.pop('yaxis', False)
    show_range: bool = kwargs.pop('range_tool', True)
    xgrid: bool = kwargs.pop('xgrid', True)
    ygrid: bool = kwargs.pop('ygrid', False)
    (tool_tip_columns, min_time, max_time) = _unpack_data_series_dict(data, **kwargs)
    series_count = len(data)
    tool_tip_items = [(f'{col}', f'@{col}') for col in tool_tip_columns]
    hover = HoverTool(tooltips=tool_tip_items, formatters={'Tooltip': 'printf'})
    title = (f'Timeline: {title}' if title else 'Event Timeline')
    start_range = (min_time - ((max_time - min_time) * 0.1))
    end_range = (max_time + ((max_time - min_time) * 0.1))
    height = (height if height else _calc_auto_plot_height(len(data)))
    y_range = (((- 1) / series_count), ((series_count - 1) + (1 / series_count)))
    plot = figure(x_range=(start_range, end_range), y_range=y_range, min_border_left=50, plot_height=height, plot_width=width, x_axis_label='Event Time', x_axis_type='datetime', x_minor_ticks=10, tools=[hover, 'xwheel_zoom', 'box_zoom', 'reset', 'save', 'xpan'], title=title)
    plot.yaxis.visible = show_yaxis
    if show_yaxis:
        if data:
            y_labels = {ser_def['y_index']: str(lbl) for (lbl, ser_def) in data.items()}
            plot.yaxis.major_label_overrides = y_labels
    if ygrid:
        plot.ygrid.minor_grid_line_color = 'navy'
        plot.ygrid.minor_grid_line_alpha = 0.1
        plot.ygrid.grid_line_color = 'navy'
        plot.ygrid.grid_line_alpha = 0.3
    else:
        plot.ygrid.grid_line_color = None
    if xgrid:
        plot.xgrid.minor_grid_line_color = 'navy'
        plot.xgrid.minor_grid_line_alpha = 0.3
    else:
        plot.xgrid.grid_line_color = None
    rng_select = _create_range_tool(data=data, min_time=min_time, max_time=max_time, plot_range=plot.x_range, width=width, height=height)
    plot.xaxis[0].formatter = _get_tick_formatter()
    if ((series_count > 1) and (not legend_pos)):
        legend_pos = 'left'
    legend_items = []
    for (ser_name, series_def) in data.items():
        if (legend_pos == 'inline'):
            p_series = plot.diamond(x=series_def['time_column'], y='y_index', color=series_def['color'], alpha=0.5, size=10, source=series_def['source'], legend_label=str(ser_name))
        else:
            p_series = plot.diamond(x=series_def['time_column'], y='y_index', color=series_def['color'], alpha=0.5, size=10, source=series_def['source'])
        if (legend_pos in ['left', 'right']):
            legend_items.append((str(ser_name), [p_series]))
    if (legend_pos == 'inline'):
        plot.legend.location = 'center_left'
        plot.legend.click_policy = 'hide'
    elif (legend_pos in ['left', 'right']):
        ext_legend = Legend(items=legend_items, location='center', click_policy='hide', label_text_font_size='8pt')
        plot.add_layout(ext_legend, legend_pos)
    if (ref_time is not None):
        _add_ref_line(plot, ref_time, ref_label, len(data))
    if show_range:
        show(column(plot, rng_select))
    else:
        show(plot)
    return plot
Display a timeline of events.

Parameters
----------
data : dict
    Data points to plot on the timeline.
        Need to contain:
            Key - Name of data type to be displayed in legend
            Value - dict of data containing:
                data : pd.DataFrame
                    Data to plot
                time_column : str
                    Name of the timestamp column
                source_columns : list
                    List of source columns to use in tooltips
                color: str
                    Color of datapoints for this data
Other Parameters
----------------
ref_time : datetime, optional
    Input reference line to display (the default is None)
title : str, optional
    Title to display (the default is None)
time_column : str, optional
    Name of the timestamp column
    (the default is 'TimeGenerated')
legend: str, optional
    Where to position the legend
    None, left, right or inline (default is None)
yaxis : bool, optional
    Whether to show the yaxis and labels
range_tool : bool, optional
    Show the the range slider tool (default is True)
source_columns : list, optional
    List of default source columns to use in tooltips
    (the default is None)
height : int, optional
    The height of the plot figure
    (the default is auto-calculated height)
width : int, optional
    The width of the plot figure (the default is 900)

Returns
-------
figure
    The bokeh plot figure.
def _display_timeline_dict(data: dict, **kwargs) -> figure:
    "\n    Display a timeline of events.\n\n    Parameters\n    ----------\n    data : dict\n        Data points to plot on the timeline.\n            Need to contain:\n                Key - Name of data type to be displayed in legend\n                Value - dict of data containing:\n                    data : pd.DataFrame\n                        Data to plot\n                    time_column : str\n                        Name of the timestamp column\n                    source_columns : list\n                        List of source columns to use in tooltips\n                    color: str\n                        Color of datapoints for this data\n    Other Parameters\n    ----------------\n    ref_time : datetime, optional\n        Input reference line to display (the default is None)\n    title : str, optional\n        Title to display (the default is None)\n    time_column : str, optional\n        Name of the timestamp column\n        (the default is 'TimeGenerated')\n    legend: str, optional\n        Where to position the legend\n        None, left, right or inline (default is None)\n    yaxis : bool, optional\n        Whether to show the yaxis and labels\n    range_tool : bool, optional\n        Show the the range slider tool (default is True)\n    source_columns : list, optional\n        List of default source columns to use in tooltips\n        (the default is None)\n    height : int, optional\n        The height of the plot figure\n        (the default is auto-calculated height)\n    width : int, optional\n        The width of the plot figure (the default is 900)\n\n    Returns\n    -------\n    figure\n        The bokeh plot figure.\n\n    "
    reset_output()
    output_notebook()
    height: int = kwargs.pop('height', None)
    width: int = kwargs.pop('width', 900)
    ref_time: Any = kwargs.pop('ref_time', None)
    ref_label: str = kwargs.pop('ref_label', None)
    title: str = kwargs.pop('title', None)
    legend_pos: str = kwargs.pop('legend', None)
    show_yaxis: bool = kwargs.pop('yaxis', False)
    show_range: bool = kwargs.pop('range_tool', True)
    xgrid: bool = kwargs.pop('xgrid', True)
    ygrid: bool = kwargs.pop('ygrid', False)
    (tool_tip_columns, min_time, max_time) = _unpack_data_series_dict(data, **kwargs)
    series_count = len(data)
    tool_tip_items = [(f'{col}', f'@{col}') for col in tool_tip_columns]
    hover = HoverTool(tooltips=tool_tip_items, formatters={'Tooltip': 'printf'})
    title = (f'Timeline: {title}' if title else 'Event Timeline')
    start_range = (min_time - ((max_time - min_time) * 0.1))
    end_range = (max_time + ((max_time - min_time) * 0.1))
    height = (height if height else _calc_auto_plot_height(len(data)))
    y_range = (((- 1) / series_count), ((series_count - 1) + (1 / series_count)))
    plot = figure(x_range=(start_range, end_range), y_range=y_range, min_border_left=50, plot_height=height, plot_width=width, x_axis_label='Event Time', x_axis_type='datetime', x_minor_ticks=10, tools=[hover, 'xwheel_zoom', 'box_zoom', 'reset', 'save', 'xpan'], title=title)
    plot.yaxis.visible = show_yaxis
    if show_yaxis:
        if data:
            y_labels = {ser_def['y_index']: str(lbl) for (lbl, ser_def) in data.items()}
            plot.yaxis.major_label_overrides = y_labels
    if ygrid:
        plot.ygrid.minor_grid_line_color = 'navy'
        plot.ygrid.minor_grid_line_alpha = 0.1
        plot.ygrid.grid_line_color = 'navy'
        plot.ygrid.grid_line_alpha = 0.3
    else:
        plot.ygrid.grid_line_color = None
    if xgrid:
        plot.xgrid.minor_grid_line_color = 'navy'
        plot.xgrid.minor_grid_line_alpha = 0.3
    else:
        plot.xgrid.grid_line_color = None
    rng_select = _create_range_tool(data=data, min_time=min_time, max_time=max_time, plot_range=plot.x_range, width=width, height=height)
    plot.xaxis[0].formatter = _get_tick_formatter()
    if ((series_count > 1) and (not legend_pos)):
        legend_pos = 'left'
    legend_items = []
    for (ser_name, series_def) in data.items():
        if (legend_pos == 'inline'):
            p_series = plot.diamond(x=series_def['time_column'], y='y_index', color=series_def['color'], alpha=0.5, size=10, source=series_def['source'], legend_label=str(ser_name))
        else:
            p_series = plot.diamond(x=series_def['time_column'], y='y_index', color=series_def['color'], alpha=0.5, size=10, source=series_def['source'])
        if (legend_pos in ['left', 'right']):
            legend_items.append((str(ser_name), [p_series]))
    if (legend_pos == 'inline'):
        plot.legend.location = 'center_left'
        plot.legend.click_policy = 'hide'
    elif (legend_pos in ['left', 'right']):
        ext_legend = Legend(items=legend_items, location='center', click_policy='hide', label_text_font_size='8pt')
        plot.add_layout(ext_legend, legend_pos)
    if (ref_time is not None):
        _add_ref_line(plot, ref_time, ref_label, len(data))
    if show_range:
        show(column(plot, rng_select))
    else:
        show(plot)
    return plot