我有一个包含多行的Python散景图,有没有办法可以交互式地打开和关闭其中一些行?
p1.line(Time,Temp0,size=12,color=getcolor())
p1.line(Time,Temp1,size=12,color=getcolor())
p1.line(Time,Temp2,size=12,color=getcolor())
p1.line(Time,Temp3,size=12,color=getcolor())
....
show(p1)
答案 0 :(得分:2)
我刚遇到this problem myself in a similar scenario。就我而言,我也想对其进行其他操作。
有两种可能的方法:
1。)客户端 - 服务器方法
2。)仅客户方法
1。)客户端服务器方法ak Bokeh服务器
实现此交互性的一种方法是使用散景服务器,您可以阅读有关here的更多信息。我会更详细地描述这种方式,因为在这一点上,我对它更加熟悉。
按照上面的例子,如果我要使用散景服务,我会首先设置一个ColumnDataSource,如下所示:
source = ColumnDataSource(data = dict(
time = Time,
temp0 = [],
temp1 = [],
temp2 = [],
temp3 = [],
)
接下来我会setup a widget允许你切换要显示的温度:
multi_select = MultiSelect(title="Option:", value=["Temp1"],
options=["Temp1", "Temp2", "Temp3"])
# Add an event listener on the python side.
multi_select.on_change('value', lambda attr, old, new: update())
然后我会定义更新函数,如下所示。更新功能的目的是使用您想要在图表中填充的值更新ColumnDataSource(之前为空)。
def update():
"""This function will syncronize the server data object with
your browser data object. """
# Here I retrieve the value of selected elements from multi-select
selection_options = multi_select.options
selections = multi_select.value
for option in selection_options:
if option not in selections:
source.data[option] = []
else:
# I am assuming your temperatures are in a dataframe.
source.data[option] = df[option]
最后要做的是重新定义你如何绘制你的字形。我们不是从列表或数据框中绘制,而是从ColumnDataSource中绘制数据,如下所示:
p1.line("time","temp0", source=source, size=12,color=getcolor())
p1.line("time","temp1", source=source, size=12,color=getcolor())
p1.line("time","temp2", source=source, size=12,color=getcolor())
p1.line(Time,Temp3, source=source, size=12,color=getcolor())
因此,基本上通过控制与浏览器对象同步的ColumnDataSource的内容,我可以切换是否显示数据点。您可能需要也可能不需要定义多个ColumnDataSource。首先尝试这种方式。
2.。)客户端仅接近ak回调
上述方法使用客户端 - 服务器架构。另一种可能的方法是在前端完成所有操作。 This link显示了如何通过各种形式的回调在浏览器端完成一些简单的交互。
无论如何,我希望这是有帮助的。干杯!
答案 1 :(得分:0)
问题是从前传来的,但是Bokeh现在具有交互式图例功能-您可以指定
your_figure.legend.click_policy = 'hide'
这将使图例在列出您的行时具有交互性,您可以打开/关闭每行