首页 > 解决方案 > Bokeh + Holoviews 绘图的 M*N 布局

问题描述

我有 N 个图,我想以 M*N 布局显示图,其中 M=1,2,3,.....

    import holoviews as hv
    from bokeh.layouts import layout as bk_lyout
    from bokeh.layouts import row, column
    from bokeh.models import (HoverTool, Panel, CustomJS)
    from bokeh.models.widgets import (Tabs, Select, Button)
    from bokeh.models.widgets.inputs import AutocompleteInput
    from dask import dataframe as dd
    from bokeh.core.enums import SizingMode
    from holoviews.operation.datashader import datashade
    
    def get_vmap(x, y, label=''):
        if x not in cols or y not in cols:
            return None
        hover = HoverTool(tooltips=[('x-value', '@' + x + '{%F %H:%M:%Ss %6Nms}'),
                                    ('y-value', '$y')],
                          formatters={'@timestamp': 'datetime'})
        curve_generated = curve(x, y, label=label)
        vmap = datashade(curve_generated, normalization='linear').opts(width=400, height=400)

        range_stream = hv.streams.RangeX(source=curve_generated)
        filtered_zoom = curve_generated.apply(xrange_filter, streams=[range_stream])
        hover_enabled = filtered_zoom.opts(tools=[hover])
        # hover_enabled = hv.util.Dynamic(aggregate(curve_generated, width=50, height=50), operation=hv.QuadMesh).opts(tools=[hover], alpha=0, hover_alpha=0.1)
        return vmap * hover_enabled

     plot_layout = column(children=[]) 
     def modify_doc(doc):
        plots = []
        for key, value in PLOT_INFO.items():
            overlay_plots = []
            for carrier in range(7):
                car_value = value.format(carrier)
                plot_label = "{}-Carrier_{}".format(key.split("_vs_")[1], carrier)
                carrier_plot = get_vmap('timestamp', car_value, label=plot_label)
                if carrier_plot is not None:
                    print('\n Found plot for Carrier {}, {}'.format(carrier, carrier_plot))
                    overlay_plots.append(carrier_plot)

            overlaid_plot = None
            for plot in overlay_plots:
                overlaid_plot = overlaid_plot * plot if overlaid_plot is not None else plot
            #overlaid_plot = hv.Overlay(overlay_plots).collate()
            if overlaid_plot is not None:
                try:
                    hv_overlay_plot = renderer.get_plot(overlaid_plot, doc)
                    hv_overlay_plot = bk_lyout([[hv_overlay_plot.state]], sizing_mode='fixed')
                    select.js_link('value', hv_overlay_plot, 'sizing_mode')
                    plots.append(hv_overlay_plot)
                    plot_layout.children.append(hv_overlay_plot)
                except Exception as e:
                    print(e)
      tab = Panel(child=plot_layout, title='Interactive Dashboard')

这里plot_layout.children有地块列表,我想在 M*N 中显示它们。例如 10 个地块,每行 2 个,用户应该可以选择修改它,比如选择 5 个地块,然后选择 2 行。

标签: bokehholoviews

解决方案


推荐阅读