我正在尝试输入一个包含来自不同数据包流的数据的单个文件(因此,不同的时间值)。我每次创建一个数据框,每个数据框中的数据点/列都绘制在单个图中。我无法了解如何附加图例中的项目以反映循环中正确的列名称。这是我到目前为止所拥有的:
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)
图例中的项目列表是我不知道如何动态添加到=/
在我看来,最佳实践是在
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)
输出: