Zeppelin 的内联散景图

Posted

技术标签:

【中文标题】Zeppelin 的内联散景图【英文标题】:Inline Bokeh Graph with Zeppelin 【发布时间】:2016-05-11 01:49:16 【问题描述】:

是否可以使用 Pyspark 解释器在 Zeppelin 中内联显示散景图?

例如在 Jupiter 中,这可以使用命令 output_notebook() 来加载散景 js。

这是一个生成简单折线图的示例。

from bokeh.io import output_notebook, show
from bokeh.plotting import figure

output_notebook()

# create a new plot 
p = figure(plot_width=400, plot_height=400, title="Simple Line Plot")

# add a line renderer
p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=2)

show(p) # show the results

【问题讨论】:

据我所知,没有人就 Zeppelin 支持与我们联系。从来没有任何关于它的 GH 问题或请求,核心开发团队也没有提到它。 (例如,我实际上根本不熟悉 Zeppelin,在看到这个之前我从未听说过它)。这是相当专业的,因此可能是感兴趣的社区成员必须贡献或解决的问题,但是如果您确实找到了解决方案,如果您愿意与我们分享(在 GH 或邮件列表上),我将不胜感激,所以我们可以将它包含在我们的文档中。 【参考方案1】:

实际上已注册发布此内容 - 我正在尝试使其工作,但遇到了一些有趣的问题。

Bokeh notebook 的输出似乎依赖于 IPython notebook,而 zeppelin 可能不会。

对于静态输出,很多 IPython notebook 常用的资源在 Zeppelin 中并不容易获得。

我在这里尝试了一种解决方法,但它最终可能会起作用 - Zeppelin 有一些 Angular 标记,可用于呈现 Bokeh html 文件。

我刚刚将它与以下内容内联:

s = "%html "
txt = open('log_lines.html').read()
s += txt
print(s)

编辑:看起来您仍然需要在图形/对象上调用 show() 来创建要显示的文件。这似乎不会产生错误,但我对 Bokeh 还是很陌生。

【讨论】:

我打算将此作为评论添加,但没有声誉 - 我希望在几个小时内有一些代码来解决这个问题。 一个简单而肮脏的解决方法是将 Bokeh html 放在 Web 服务器文件夹中(我使用 Apache)并使用 localhost 将其读回 Zeppelin 太棒了 - 我刚刚将它与以下内容内联: s = "%html " txt = open('log_lines.html').read() s += txt print(s) 【参考方案2】:

我的项目需要和弦图,并成功地调整了散景示例以在 pyspark 和 Zeppelin 的 python 解释器中运行。对 Zeppelin 的支持仍然需要一些爱,但对于我的目的来说已经足够了。

%pyspark

import matplotlib as mpl
mpl.use('Agg')
import pandas as pd
from bokeh.charts import Chord
from bokeh.io import show, output_file, output_notebook
from bokeh.sampledata.les_mis import data

nodes = data['nodes']
links = data['links']

nodes_df = pd.DataFrame(nodes)
links_df = pd.DataFrame(links)

source_data = links_df.merge(nodes_df, how='left', left_on='source', right_index=True)
source_data = source_data.merge(nodes_df, how='left', left_on='target', right_index=True)
source_data = source_data[source_data["value"] > 5]  # Select those with 5 or more connections

chord_from_df = Chord(source_data, source="name_x", target="name_y", value="value")
#output_file('chord_from_df.html')
output_notebook(notebook_type='zeppelin')
show(chord_from_df)

【讨论】:

【参考方案3】:

如果您使用的是 Bokeh >= 0.12.7,您可以使用 Jeff Zhang 的 bkzep 包。例如,在 Zeppelin 之外执行此操作:

pip install bkzep

然后,正如 https://github.com/zjffdu/bkzep#how-to-use 所说,您只需在绑定到 Spark 解释器组的 Zeppelin 笔记本中执行此操作:

from bokeh.io import output_notebook
import bkzep
output_notebook(notebook_type='zeppelin')

然后您应该能够在笔记本中看到内嵌的散景图。我可以使用 Bokeh 0.12.13 确认这在 Zeppelin 0.7.0 中有效。示例:

【讨论】:

以上是关于Zeppelin 的内联散景图的主要内容,如果未能解决你的问题,请参考以下文章

Django中的散景图返回空白页

在Flask中嵌入散景图

尝试在 Django 上传按钮旁边嵌入散景图时出现 ImportError

散景图上的多个滑块

在 django 中使用交互式控件制作散景图

带有 `import bokeh` 的烧瓶,带有 2 个没有外部散景服务器的散景图,而不是“模型只能由一个文档拥有”