如何在Sphinx文档和nbsphinx中嵌入Plotly图表

36

我尝试使用nbsphinx嵌入包含plotly图表的Jupyter笔记本,但是这些图表在文档中没有显示出来,尽管它们在Jupyter笔记本中看起来很好。

我该如何在Sphinx文档中嵌入plotly图形? 我可以将它们作为图像包含,但有更好的方法吗? 最好能够进行交互!

我想做的是复制此页面。它具有Jupyter笔记本风格的内部和外部块,并显示使用plotly制作的交互式图。我该怎么做?

这里提出了GitHub问题。


1
{btsdaf} - phantomas1234
1
{btsdaf} - bluprince13
使用Plotly,您可以使用output_type ='div'输出HTML。 - J63
2
这在新的FigureWidget下更容易了。如果有兴趣,我可以准备一个答案。 - astrojuanlu
8个回答

3
我可以看到两种解决方案来在Sphinx文档中嵌入带有Plotly图形的笔记本单元格。
  1. 使用nbconvert或nbsphinx将笔记本转换为HTML。请确保使用notebook渲染器,以便包括plotly javascript捆绑包(也许这就是您的图形未显示的原因)。有关plotly渲染器的文档,请参见https://plot.ly/python/renderers/。然后,您可以使用各种解决方案将HTML包含在Sphinx文档中(请参见在Sphinx文档中包含独立的HTML页面)。
  2. 使用sphinx-gallery(https://sphinx-gallery.github.io/)及其plotly刮刀。使用sphinx-gallery,您可以将文档页编写为Python脚本,该脚本由sphinx的sphinx-gallery扩展转换为rest。要配置刮刀,请参见https://sphinx-gallery.github.io/advanced.html#integrate-custom-scrapers-with-sphinx-gallery。我们还有一个最小的存储库,展示了如何在plotly和sphinx-gallery一起使用https://github.com/plotly/plotly-sphinx-gallery

3

这个图表本身是一个嵌入在jupyter笔记本文件中的HTML。您可以在任何文本编辑器中打开notebook.ipnb文件,找到图表HTML开始的位置,将所有HTML复制到html文件中并保存,例如a.html,然后只需在RST文档中插入原始html即可。

.. raw:: 
    :file: a.html

2
我们在使用和主题时遇到了这个问题。因为Plotly和Sphinx主题都使用,默认生成的HTML输出在Sphinx上下文中无法正常工作,会出现各种加载错误,包括或其他文件。
以下是我们的解决方案:
  • 确保您的JavaScript在主题的标签中加载。如果在标签的末尾加载,将无法使用任何解决方法。
  • 从Sphinx的_static文件夹中本地服务器加载
  • 通过使用custom.js配置
示例:
html_js_files = [
    "require.min.js",  # Add to your _static
    "custom.js",
]

示例 custom.js:

requirejs.config({
    paths: {
        base: '/static/base',
        plotly: 'https://cdn.plot.ly/plotly-2.12.1.min.js?noext',
    },
});

这样做

  • 当在Jupyter中运行时,笔记本正确地呈现交互式图表
  • 当作为静态HTML文件查看时,笔记本正确地呈现交互式图表
  • 当在ReadTheDocs上查看时,笔记本正确地呈现交互式图表

在此处查看示例开源文档示例笔记本


1

在尝试了许多解决方法后,对我有效的解决方案是在笔记本的开头添加这些行。

import plotly
plotly.offline.init_notebook_mode()

对于我来说,涉及修改conf.py中的选项nbsphinx_prolognbsphinx_requirejs_optionshtml_js_files的解决方案都不起作用。

我正在使用sphinx_rtd_theme HTML主题和以下版本:

nbsphinx==0.8.9
sphinx-autobuild==2021.3.14
sphinx==4.4.0

这对我来说很合适。 - Olivier_s_j

0

通过使用Python,您可以使用plotly.tools.get_embed函数生成HTML代码来嵌入Plotly图形。

import plotly.tools as tls

tls.get_embed('https://plot.ly/~chris/1638')

0
当Sphinx生成文档时,它不会描述plotly库,因此请将以下行添加到您的HTML页面中:
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>

然后页面将会重新启动。


0
你可以使用Jupyter Sphinx Extension
.. jupyter-execute::

   import plotly.graph_objects as go

   trace = go.Scatter(
       x=[0, 1, 2, 3, 4],
       y=[0, 1, 4, 9, 16],
   )
   layout = go.Layout(title='Growth')
   figure = go.Figure(data=[trace], layout=layout)
   figure.show()

这似乎无法与我的pdflatex一起使用...您在文档中之前是否有一些jupyter-execute设置? - Matt Ruge
@MattRuge 我还没有尝试使用LaTeX输出,所以我不知道。 :-) - Peque
我通过让jupyter-execute转储IMG字节取得了一些进展,在latex pdf中以png格式显示。 .. jupyter-execute:: :hide-code: # 创建图形##已删除以缩短篇幅 img_bytes = fig.to_image(format="png") Image(img_bytes) - Matt Ruge
我相信,除非您使用https://plotly.com/python/static-image-export/显式配置,否则plotly不会默认生成静态图。目前,我正在寻找在Github存储库中具有交互式plotly图形的README.rst文件,到目前为止,我已经成功使用静态图像。 - IF.Francisco.ME

-1

在你的笔记本顶部尝试这个:

import plotly.io as pio
pio.renderers.default = "sphinx_gallery"

这个渲染器确保您的笔记本电脑(或单元格输出,或其他什么,不确定!)包括您的单元格输出需要呈现绘图所需的JavaScript资源。

其他渲染器或设置也可能实现此目的。但到目前为止,这是我尝试过的唯一一个渲染器,在其中我可以使用sphinx(实际上是jupyter book)构建笔记本,并且交互式绘图显示在构建中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接