使用 Python Bokeh 在单个输出中绘制多个数据帧 - 如何为循环中的每个图创建图例?

问题描述 投票:0回答:1

我正在尝试输入一个包含来自不同数据包流的数据的单个文件(因此,不同的时间值)。我每次创建一个数据框,每个数据框中的数据点/列都绘制在单个图中。我无法了解如何附加图例中的项目以反映循环中正确的列名称。这是我到目前为止所拥有的:

j = 0
tabs_df_list = []
## Creating source and figures for each df
for x in df_list:
    j += 1
    df_col_names = x.columns.to_numpy()
    col_names = df_col_names.tolist()
    source = "source"+str(j)
    source = ColumnDataSource(x)
## Create a figure for each df
    p = "p" + str(j)
    p = figure(title = 'Test Tlm Report',
           match_aspect = False,
           toolbar_location = 'right',
           height=750, width=1000,
           x_axis_label = 'Time [hh:mm]', # needs to correct time series
           y_axis_label = 'Data value')    # need to customize to tlm col

    tabs_temp = []
    items_list = []
    k = 1
    while k < len(col_names):
        r = "r" + str(k)
        r = p.line(x=col_names[0], y=col_names[k], source=source, line_width=2, line_color="lightseagreen", name=col_names[k], legend_label=col_names[k])
        r = p.scatter(x=col_names[0], y=col_names[k], source=source)
        items_list.append(col_names[k])
        items_list.append(r)
        tab = [TabPanel(child=p, title=col_names[0])]
        k += 1
   
        
    p.add_tools(HoverTool(tooltips=tooltips))
    legend = Legend(items=[items_list
                          ],location=(3, -25))
    p.add_layout(legend, 'right')
    
    p.legend.click_policy="mute"    
    
    tabs_df = "tabss" + str(j)
    tabs_df = Tabs(tabs=tab)
    tabs_df_list.append(tabs_df)
grid = gridplot (tabs_df_list, ncols=1)
show (grid)

图例中的项目列表是我不知道如何动态添加到=/

python pandas dataframe plot bokeh
1个回答
0
投票

在我看来,最佳实践是在

figure()
调用之后定义图例,并在使用
legend_item
创建渲染器时添加每个图例条目。

最小示例:

假设这是我们的数据:

import pandas as pd

df = pd.DataFrame({"x": [1,2,3], "a": [1,2,3], "b": [2,2,2], "c": [3,2,1]})

然后我们可以循环列名称,并在像

p.line()
legend_label=column_name
这样的调用中将此名称添加到图例中。

from bokeh.models import Legend
from bokeh.palettes import d3
from bokeh.plotting import figure, show, output_notebook
output_notebook()

p = figure()
legend = Legend(click_policy='mute')
p.add_layout(legend, 'right')
for i, column_name in enumerate(df.columns):
    if column_name == 'x':
        continue
    p.line(df['x'], df[column], legend_label=column_name, color=d3['Category10'][10][i])
show(p)

输出:

line plot with legend

© www.soinside.com 2019 - 2024. All rights reserved.