【问题标题】:Generating Jupyter notebook with nbformat - Altair charts not displaying使用 nbformat 生成 Jupyter 笔记本 - Altair 图表不显示
【发布时间】:2019-11-11 18:58:21
【问题描述】:

我正在尝试以编程方式生成笔记本,执行它,然后使用 nbformat 转换为 HTML。

代码基本上是这样的:

import nbformat as nbf 
from nbconvert.preprocessors import ExecutePreprocessor
from nbconvert import HTMLExporter
 
nb = nbf.v4.new_notebook()
nb.cells = [nbf.v4.new_code_cell("""
   import altair as alt
   alt.renderers.enable("notebook")
   # ... load df
   alt.Chart(df).mark_point().encode(x='x', y='y')
""")]

ep = ExecutePreprocessor(timeout=600, kernel_name='python3')
ep.preprocess(nb, {'metadata': {'path': '.'}})

html_exporter = HTMLExporter()      
html_exporter.template_file = 'basic'
(body, resources) = html_exporter.from_notebook_node(nb)
with open('out.html', 'w') as f:
    f.write(body)

流程运行良好,它生成一个笔记本和一个 HTML 文件,所有代码都已执行。但是,代码单元格的输出如下(无图表):

<vega.vegalite.VegaLite at 0x7f80c4d8a090>

当我将 notebook 写为 .ipynb 文件并手动执行时,在相同的环境中,图表按预期显示。是否可以通过这种方式使用 Altair?我想知道我在 Python 会话中运行 nbformat 是否会有所不同,也许它只能在浏览器中呈现图表?

【问题讨论】:

    标签: python jupyter-notebook jupyter altair


    【解决方案1】:

    通过 nbformat 生成笔记本和实时运行笔记本的区别在于 nbformat 没有附加前端。这在这里很重要,因为对于 Altair 图表,前端笔记本扩展是呈现图表的内容。

    那么为什么在生成后打开笔记本时渲染的图表不显示呢?这是因为 Jupyter notebook 的安全模型:当打开一个新的不受信任的 notebook 时,notebook 不会执行现有的 Javascript,因为这将是一个简单的攻击路径(例如,攻击者可以发布一个带有 javascript 的 notebook,在加载时执行 python在您有机会阅读笔记本内容之前搜索您的硬盘驱动器以获取敏感信息并将其邮寄给攻击者的代码)。

    因此,在渲染图表时,vega 笔记本扩展程序会生成一个 PNG 预览并将其保存到笔记本中,因此当您与其他人共享它时,他们会获得一个静态图表预览作为占位符,直到他们实际执行笔记本。 但是如果您在没有前端的情况下执行 notebook,则不会生成此 PNG 预览,因此在打开 notebook 时您什么也看不到。

    解决此问题的最佳方法是使用 JupyterLab 而不是 Juptyer Notebook。在 JupyterLab 中,Altair 图表使用 VegaLite Mimetype 保存,由 vega labextension 解释并转换为图表。这不涉及从笔记本执行任意 javascript,因此您以这种方式创建的图表将在 JupyterLab 的加载时呈现在笔记本中。这个路径在经典笔记本中没有使用,因为经典不支持基于 mimebundle 的渲染。

    如果您必须使用 Jupyter Notebook 而不是 JupterLab,那么除了可能使用无头浏览器引擎(例如 selenium)以编程方式使用将呈现 PNG 的浏览器前端执行您的 notebook预览。

    【讨论】:

    • 谢谢杰克,感谢您的帮助。我可以使用 JupyterLab 而不是 Notebook,但要明确的是,我的目标是以编程方式生成一个带有渲染图表的 HTML 文件,可能是 pngs。
    • 哦,对不起,我误解了。要生成可在笔记本外使用的 HTML,您可以尝试“colab”渲染器。它为所有图表输出独立的 HTML。
    • 哦,太好了。我确实尝试过,得到了“空”图表——没有数据绘制的轴——但如果可能的话,我会继续尝试。
    • 如果您的坐标轴没有数据,我怀疑这是因为您通过 URL 指定数据,然后从 file:// URL 打开 HTML,该 URL 无法访问 http:// 数据源,因为您的浏览器的跨域安全策略。尝试使用python -m http.server 查看 HTML 文件。
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2018-10-13
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多