与Jupyter一起使用

在笔记本上工作

Jupyter 笔记本是可计算的文件,通常用于探索性工作、数据分析、教学和演示。笔记本是一系列 输入单元格 可以单独执行,以便在单元之后立即显示其输出。除了 经典的 笔记本,也有更新的笔记本 JupyterLab 项目。Bokeh可以嵌入独立的和Bokeh服务器的内容。

独立输出

独立的Bokeh内容(即不使用Bokeh服务器)可以直接嵌入到经典的Jupyter笔记本和JupyterLab中。

经典笔记本

要在经典的Jupyter笔记本中显示Bokeh绘图,请使用 output_notebook() 函数来自|博克.io|代替(或补充) output_file() 我们以前见过的函数。无需其他修改。什么时候? show() 调用时,绘图将以内联方式显示在下一个笔记本输出单元格中。您可以在下面看到Jupyter截图:

../../_images/notebook_inline.png

调用 show() 在输入单元格中多次。绘图将按顺序显示。

../../_images/notebook_inline_multiple.png

JupyterLab

为了在JupyterLab中嵌入Bokeh图,需要安装两个JupyterLab扩展。首先,安装 jupyterlab-manager 通过运行以下命令:

jupyter labextension install @jupyter-widgets/jupyterlab-manager

然后同样地安装 jupyter_bokeh 扩展:

jupyter labextension install @bokeh/jupyter_bokeh

安装后,使用方法与上述经典笔记本相同。

../../_images/joyplot_jupyter_lab.png

Bokeh服务器应用程序

还可以嵌入完整的Bokeh服务器应用程序,这些应用程序可以将plot事件和Bokeh的内置小部件直接连接到Python回调代码。看到了吗 运行Bokeh服务器 有关Bokeh服务器应用程序的一般信息,以及以下笔记本电脑中嵌入的Bokeh应用程序的完整示例:

JupyterHub

在运行juterkeh服务器的客户端和服务器之间嵌入一些连接是必要的。这是因为您的浏览器需要连接到Bokeh服务器监听的端口,但是JupyterHub充当浏览器和JupyterLab容器之间的反向代理。遵循上面的所有JupyterLab说明,然后继续下面的步骤。

首先,必须安装 nbserverproxy 服务器扩展。这可以通过运行以下命令来完成:

pip install nbserverproxy && jupyter serverextension enable --py nbserverproxy

其次,必须定义一个函数来帮助创建浏览器用来连接Bokeh服务器的URL。这将被传递到 show() 在最后一步。这里提供了一个引用实现,但您必须修改它或定义环境变量 EXTERNAL_URL 到JupeterHub安装的URL。默认情况下,JupeterHub将设置 JUPYTERHUB_SERVICE_PREFIX .

def remote_jupyter_proxy_url(port):
    """
    Callable to configure Bokeh's show method when a proxy must be
    configured.

    If port is None we're asking about the URL
    for the origin header.
    """
    base_url = os.environ['EXTERNAL_URL']
    host = urllib.parse.urlparse(base_url).netloc

    # If port is None we're asking for the URL origin
    # so return the public hostname.
    if port is None:
        return host

    service_url_path = os.environ['JUPYTERHUB_SERVICE_PREFIX']
    proxy_url_path = 'proxy/%d' % port

    user_url = urllib.parse.urljoin(base_url, service_url_path)
    full_url = urllib.parse.urljoin(user_url, proxy_url_path)
    return full_url

最后,可以将步骤2中定义的函数传递给 show() 作为notebook_url关键字参数,Bokeh将在设置服务器并创建用于加载图形的url时调用该参数:

show(obj, notebook_url=remote_jupyter_proxy_url)

此时,Bokeh图应该加载并执行JupyterLab环境中定义的python回调。

信任笔记本

根据正在使用的笔记本的版本,可能需要“信任”笔记本,以便在笔记本关闭并随后重新打开时重新渲染Bokeh绘图。“信任笔记本”选项通常位于“文件”菜单下:

../../_images/notebook_trust.png

笔记本幻灯片

It is possible to use a notebook in conjunction with Reveal.js to generate slideshows from notebook cell content. It is also possible to include standalone (i.e. non-server) Bokeh plots in such sideshows, however, some steps must be followed to correctly display the output. Primarily: the cell containing output_notebook must be not be skipped.

的渲染单元输出 output_notebook call负责确保BokehJS库已加载。没有这些,博克图就无法发挥作用。如果标记了此单元格类型 “跳过” 然后不会加载BokehJS,也不会显示Bokeh图。如果要隐藏此单元格,另一种方法是将其标记为 “注释” 滑动类型。

笔记本手柄

可以在适当位置更新先前显示的绘图。当争论 notebook_handle=True 传递给 show() ,则返回句柄对象。此句柄对象可以与 push_notebook() 函数更新绘图属性、数据源值等的最新更改 notebook handle 功能仅在经典的Jupyter笔记本电脑中受支持,但尚未在JupyterLab或Zeppelin中实现。

下面的屏幕截图介绍了笔记本手柄的基本用法。

首先,导入标准函数,以及 push_notebook()

../../_images/notebook_comms1.png

接下来,创建一些绘图,并确保通过 notebook_handle=Trueshow()

../../_images/notebook_comms2.png

查看句柄,看它与的输出单元格相关联 In[2] 刚才展示的是:

../../_images/notebook_comms3.png

现在,更新绘图的所有属性,然后调用 push_notebook() 使用手柄:

../../_images/notebook_comms4.png

执行此操作后,请注意 In[2] 已经改变了( 没有 重新执行)

../../_images/notebook_comms5.png

在以下笔记本示例中可以找到有关使用笔记本手柄的更详细的演示:

Jupyter交互器

可以使用笔记本小部件驱动Bokeh图的更新,称为 interactors . 做到这一点的关键是 push_notebook() 上述功能。通常在交互器的update回调中调用它,以从widget值更新绘图。的屏幕截图 examples/howto/notebook_comms/Jupyter Interactors.ipynb 示例笔记本如下所示:

../../_images/notebook_interactors.png

更多示例笔记本

更多使用笔记本的例子可以在 bokeh-notebook 存储库。首先,在本地克隆存储库:

git clone https://github.com/bokeh/bokeh-notebooks.git

然后,在web浏览器中启动Jupyter笔记本电脑。或者,可以立即在线运行的实时笔记本由 Binder .

另外,下面还有一些笔记本 examples 基本上 Bokeh 回购协议:

笔记本通讯示例:

我在笔记本外面躲起来

在上一节中,我们学习了如何在JupyterLab和经典笔记本环境中使用Bokeh。假设我们想做相反的事情,特别是利用充满活力的朱庇特生态系统 IPyWidgets ,在Bokeh应用程序中,在这些环境的限制之外。这可以通过 ipywidgets_bokeh Bokeh扩建:

$ conda install -c bokeh ipywidgets_bokeh

$ pip install ipywidgets_bokeh

然后你可以在Bokeh使用IPyWidget,只需将它包装起来 IPyWidget 对文档建模并将其添加到文档中或将其包含在布局中。由于这是在Jupyter之外运行的,因此不需要安装和/或启用任何扩展。

例子

假设我们想用一个Jupyter滑块创建一个应用程序,并在操纵滑块时将其值记录到控制台。我们首先构建小部件并配置一个观察者,与在Jupyter中一样:

from ipywidgets import FloatSlider
angle = FloatSlider(min=0, max=360, value=0, step=1, description="Angle")

def on_change(change):
    print(f"angle={change['new']} deg")
angle.observe(on_change, names="value")

要将widget与Bokeh集成,我们必须将其包装在 IPyWidget

from ipywidgets_bokeh import IPyWidget
ipywidget = IPyWidget(widget=angle)

然后我们将包装器添加到Bokeh文档中:

from bokeh.plotting import curdoc
doc = curdoc()
doc.add_root(ipywidget)

要运行此程序,假设代码保存在 ipy_slider.py ,我们发行 bokeh serve ipy_slider.py (见 运行Bokeh服务器 了解详情)。申请可在http://localhost:5006/ipy_滑块。

从这里,你可以创建更复杂的布局,包括高级的小部件,比如 ipyleafletipyvolume ,等等。更多示例可在Bokeh存储库中的 examples/howto/ipywidgets .