Jupyter 笔记本是可计算的文件,通常用于探索性工作、数据分析、教学和演示。笔记本是一系列 输入单元格 可以单独执行,以便在单元之后立即显示其输出。除了 经典的 笔记本,也有更新的笔记本 JupyterLab 项目。Bokeh可以嵌入独立的和Bokeh服务器的内容。
独立的Bokeh内容(即不使用Bokeh服务器)可以直接嵌入到经典的Jupyter笔记本和JupyterLab中。
要在经典的Jupyter笔记本中显示Bokeh绘图,请使用 output_notebook() 函数来自|博克.io|代替(或补充) output_file() 我们以前见过的函数。无需其他修改。什么时候? show() 调用时,绘图将以内联方式显示在下一个笔记本输出单元格中。您可以在下面看到Jupyter截图:
output_notebook()
output_file()
show()
调用 show() 在输入单元格中多次。绘图将按顺序显示。
为了在JupyterLab中嵌入Bokeh图,需要安装两个JupyterLab扩展。首先,安装 jupyterlab-manager 通过运行以下命令:
jupyter labextension install @jupyter-widgets/jupyterlab-manager
然后同样地安装 jupyter_bokeh 扩展:
jupyter labextension install @bokeh/jupyter_bokeh
安装后,使用方法与上述经典笔记本相同。
还可以嵌入完整的Bokeh服务器应用程序,这些应用程序可以将plot事件和Bokeh的内置小部件直接连接到Python回调代码。看到了吗 运行Bokeh服务器 有关Bokeh服务器应用程序的一般信息,以及以下笔记本电脑中嵌入的Bokeh应用程序的完整示例:
examples/howto/server_embed/notebook_embed.ipynb
在运行juterkeh服务器的客户端和服务器之间嵌入一些连接是必要的。这是因为您的浏览器需要连接到Bokeh服务器监听的端口,但是JupyterHub充当浏览器和JupyterLab容器之间的反向代理。遵循上面的所有JupyterLab说明,然后继续下面的步骤。
首先,必须安装 nbserverproxy 服务器扩展。这可以通过运行以下命令来完成:
nbserverproxy
pip install nbserverproxy && jupyter serverextension enable --py nbserverproxy
其次,必须定义一个函数来帮助创建浏览器用来连接Bokeh服务器的URL。这将被传递到 show() 在最后一步。这里提供了一个引用实现,但您必须修改它或定义环境变量 EXTERNAL_URL 到JupeterHub安装的URL。默认情况下,JupeterHub将设置 JUPYTERHUB_SERVICE_PREFIX .
EXTERNAL_URL
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绘图。“信任笔记本”选项通常位于“文件”菜单下:
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
的渲染单元输出 output_notebook call负责确保BokehJS库已加载。没有这些,博克图就无法发挥作用。如果标记了此单元格类型 “跳过” 然后不会加载BokehJS,也不会显示Bokeh图。如果要隐藏此单元格,另一种方法是将其标记为 “注释” 滑动类型。
可以在适当位置更新先前显示的绘图。当争论 notebook_handle=True 传递给 show() ,则返回句柄对象。此句柄对象可以与 push_notebook() 函数更新绘图属性、数据源值等的最新更改 notebook handle 功能仅在经典的Jupyter笔记本电脑中受支持,但尚未在JupyterLab或Zeppelin中实现。
notebook_handle=True
push_notebook()
下面的屏幕截图介绍了笔记本手柄的基本用法。
首先,导入标准函数,以及 push_notebook() :
接下来,创建一些绘图,并确保通过 notebook_handle=True 到 show() :
查看句柄,看它与的输出单元格相关联 In[2] 刚才展示的是:
In[2]
现在,更新绘图的所有属性,然后调用 push_notebook() 使用手柄:
执行此操作后,请注意 In[2] 已经改变了( 没有 重新执行)
在以下笔记本示例中可以找到有关使用笔记本手柄的更详细的演示:
examples/howto/notebook_comms/Basic Usage.ipynb
examples/howto/notebook_comms/Continuous Updating.ipynb
examples/howto/notebook_comms/Jupyter Interactors.ipynb
examples/howto/notebook_comms/Numba Image Example.ipynb
可以使用笔记本小部件驱动Bokeh图的更新,称为 interactors . 做到这一点的关键是 push_notebook() 上述功能。通常在交互器的update回调中调用它,以从widget值更新绘图。的屏幕截图 examples/howto/notebook_comms/Jupyter Interactors.ipynb 示例笔记本如下所示:
更多使用笔记本的例子可以在 bokeh-notebook 存储库。首先,在本地克隆存储库:
git clone https://github.com/bokeh/bokeh-notebooks.git
然后,在web浏览器中启动Jupyter笔记本电脑。或者,可以立即在线运行的实时笔记本由 Binder .
另外,下面还有一些笔记本 examples 基本上 Bokeh 回购协议:
categorical data
hover callback
linked panning
range update callback
embed server in notebook
US marriages and divorces interactive
color scatterplot
glyphs
笔记本通讯示例:
basic usage
continuous updating
Jupyter interactors
Numba image example
在上一节中,我们学习了如何在JupyterLab和经典笔记本环境中使用Bokeh。假设我们想做相反的事情,特别是利用充满活力的朱庇特生态系统 IPyWidgets ,在Bokeh应用程序中,在这些环境的限制之外。这可以通过 ipywidgets_bokeh Bokeh扩建:
$ conda install -c bokeh ipywidgets_bokeh
或
$ pip install ipywidgets_bokeh
然后你可以在Bokeh使用IPyWidget,只需将它包装起来 IPyWidget 对文档建模并将其添加到文档中或将其包含在布局中。由于这是在Jupyter之外运行的,因此不需要安装和/或启用任何扩展。
IPyWidget
假设我们想用一个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_滑块。
ipy_slider.py
bokeh serve ipy_slider.py
从这里,你可以创建更复杂的布局,包括高级的小部件,比如 ipyleaflet , ipyvolume ,等等。更多示例可在Bokeh存储库中的 examples/howto/ipywidgets .
examples/howto/ipywidgets