在Python Bokeh图中选择字形

时间:2015-02-23 17:33:03

标签: python bokeh

我有一个包含多行的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)

2 个答案:

答案 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'

这将使图例在列出您的行时具有交互性,您可以打开/关闭每行