如何为控制多个散景图形添加一个图例?
Posted
技术标签:
【中文标题】如何为控制多个散景图形添加一个图例?【英文标题】:How to add one legend for that controlls multiple bokeh figures? 【发布时间】:2019-11-11 12:01:33 【问题描述】:如何创建一个图例来控制多个散景图形?或者如何自定义使用散景创建的导出 html 文件以添加具有类似功能的图例?
这里是场景。我创建了一个包含 4 个不同图形的 html 文件。每个图形都有一个图例,其中包含特定图形中显示的各个行的标签/名称。四个图例中的每一个都可以单击以分别切换每个图中的线条。
虽然四个图各有一个图例,但线条是相关的,所以它们每一行都描述一件事。
我现在想为所有组合在一起的图形创建一个图例,以切换所有四个图形中的每一行。
也许有办法以某种方式将这种功能添加到导出的 html 文件中?
我认为有更多经验的人知道如何实现这一目标。
提前致谢!
亲切的问候
【问题讨论】:
【参考方案1】:图例不是(还?)“独立”散景模型,它们需要附加到一个人物上。现在要为多个图形添加外部图例,并将其放置在布局中的任何位置,需要一些解决方法。
我通常会像下面那样使用一个“不可见”的图形来保存共享的图例。然后,您必须手动定义图例项并为其分配标签和渲染器列表。
from bokeh.io import show
from bokeh.plotting import figure
from bokeh.models import LegendItem, Legend
from numpy.random import random, choice
from bokeh.layouts import gridplot
from webcolors import html4_names_to_hex
del html4_names_to_hex['white']
palette = list(html4_names_to_hex.keys())
fig_list = [figure(plot_width=300,plot_height=300) for i in range(4)]
renderer_list = []
color_list = []
for fig in fig_list:
for i in range(5):
color = choice(palette)
renderer = fig.line(range(10),random(10),line_width=2,color=color)
renderer_list += [renderer]
color_list += [color]
# Lines with the same color will share a same legend item
legend_items = [LegendItem(label=color,renderers=[renderer for renderer in renderer_list if renderer.glyph.line_color==color]) for color in set(color_list)]
## Use a dummy figure for the LEGEND
dum_fig = figure(plot_width=300,plot_height=600,outline_line_alpha=0,toolbar_location=None)
# set the components of the figure invisible
for fig_component in [dum_fig.grid[0],dum_fig.ygrid[0],dum_fig.xaxis[0],dum_fig.yaxis[0]]:
fig_component.visible = False
# The glyphs referred by the legend need to be present in the figure that holds the legend, so we must add them to the figure renderers
dum_fig.renderers += renderer_list
# set the figure range outside of the range of all glyphs
dum_fig.x_range.end = 1005
dum_fig.x_range.start = 1000
# add the legend
dum_fig.add_layout( Legend(click_policy='hide',location='top_left',border_line_alpha=0,items=legend_items) )
figrid = gridplot(fig_list,ncols=2,toolbar_location='left')
final = gridplot([[figrid,dum_fig]],toolbar_location=None)
show(final)
【讨论】:
以上是关于如何为控制多个散景图形添加一个图例?的主要内容,如果未能解决你的问题,请参考以下文章