将Jupyter Notebook导出为PDF时,需要离线Plotly图表;缺少图表。

8
我正在尝试创建我的教学计划的PDF导出,并使用plotly离线绘图。在下面的MWE中,图形将显示在Jupyter Notebook中,但在导出到PDF时不会显示。我使用文件-->下载为-->通过Latex (.pdf)导出PDF进行导出。
我想制作一个PDF而不是使用HTML。我知道将HTML导出转换为PDF可能需要额外的步骤,但我想知道是否有更直接的方法(代码修改?),使我可以直接通过文件-->下载为-->通过Latex (.pdf)导出PDF进行导出。
from plotly.offline import download_plotlyjs, init_notebook_mode, iplot
init_notebook_mode(connected=True)
import plotly.graph_objs as go

data = [go.Scatter(
    x=[1, 2, 3],
    y=[3, 2, 1])
]
iplot(data)
5个回答

8

您需要指定适当的默认渲染器(或者是多个渲染器,如果您想要在Notebook中可视化并且想要使用您提到的 文件-->另存为-->PDF通过Latex (.pdf)选项导出到PDF)。

我自己也苦苦挣扎了几个小时,但最终对我起作用的设置如下:

import plotly.io as pio
pio.renderers.default = "notebook+pdf"  # Renderer for Notebook and HTML exports + Renderer for PDF exports
# init_notebook_mode(connected=True)  # Do not include this line because it may not work

请注意,您可以使用加号符号将任意数量的渲染器连接起来,Plotly会自动识别何时使用每个渲染器。请参阅多个渲染器了解更多信息。

嗯,这看起来很有前途,但是我无法通过latex以pdf格式下载它。您是否介意发布一个解决方案,其中包括我的MWE代码,并确认您可以通过latex无问题地下载为pdf? - jtorca
太棒了!"init_notebook_mode"一直是罪魁祸首。谢谢你告诉我们。在我注释掉那一行之后,它终于起作用了!非常感谢! - undefined

2

由于Plotly图形是SVG对象并由JavaScript生成,因此我在Jupyter笔记本中无法将其导出为PDF,因此无法检查和确认我的答案。

Plotly离线版没有显示为图像的功能,您可以使用Plotly在线版来解决此问题,它可以免费生成图形,

您需要创建一个在线账户,并从Plotly网站粘贴用户名和API密钥(API密钥可以在设置中找到)。

注意:请在Plotly中检查图形是否是公开共享的或私人的,我不负责您的图形变成公开的责任。

无论如何,这将给您提供图形的图像输出,并且您可以将其导出为PDF

代码:

import plotly
import plotly.graph_objs as go

plotly.plotly.sign_in('<<username goes here>>', '<<api key goes here>>')
trace = go.Bar(x=[2, 4, 6], y= [10, 12, 15])
data = [trace]
layout = go.Layout(title='A Simple Plot', width=800, height=640)
fig = go.Figure(data=data, layout=layout)

plotly.plotly.image.save_as(fig, filename='a-simple-plot.png')

from IPython.display import Image
Image('a-simple-plot.png')

你只是获取了静态图像,你是否设法将交互性也导出为PDF? - Parthiban Rajendran
@PaariVendhan 互动性是由 JavaScript 引起的,PDF 无法嵌入 Javascript! - Naren Murali
我并不是说PDF应该有JavaScript,但可以以某种方式将交互性转移到PDF内部可接受的表单中。例如,tikz pgfplots具有可点击的功能。 - Parthiban Rajendran
@PaariVendhan,请向Plotly提出此增强要求并查看他们的响应,谢谢! - Naren Murali
这显然超出了Plotly和WebGL的范围。这要么取决于IPython,要么取决于我们自己。 - Parthiban Rajendran
显示剩余2条评论

2
我无法解决上述确切的原问题。但是,如果您希望考虑使用 .html 格式,这里有一个不错的解决方案,对我很有效。毕竟,我的目标只是与没有安装 Jupyter 的人分享笔记本。
将其转换为 .html 格式可使用 plotlyhtmlexporter。 以下是一段您可以复制粘贴的代码:
  pip install plotlyhtmlexporter
  jupyter nbconvert --to plotlyhtml mynotebook.ipynb

您可能想尝试将浏览器中的 .html 保存(打印)为 .pdf,但我认为这相当于将原始笔记本打印为 .pdf。就我而言,拥有一个与 Jupyter 独立的 .html 文件已经足够了。

1

只需使用此代码,并通过HTML将笔记本下载为PDF。另外,您需要先安装kaleido。

    import plotly.io as pio
    pio.kaleido.scope.default_format = "png"

1
一个更简单的解决方案是使用image_bytes = fig.to_image(format='png'),然后使用Image(image_bytes)进行显示,但首先您需要安装orca,并且
pip3 install psutil requests
例子:

fig = go.Figure()
""" here goes some code to draw """

image_bytes = fig.to_image(format='png', , width=1200, height=700, scale=1) # you can use other formats as well (like 'svg','jpeg','pdf')

#instead of using fig.show()
from IPython.display import Image
Image(img_bytes)

你可以在这里阅读更多内容。
然后,你可以使用文件 -> 下载为 -> PDF或者使用终端jupyter nbconvert --to pdf <notebook_name>.ipynb将其转换为PDF。

1
嗨,Dima Zhylko。请考虑添加更多信息,因为如果链接过时,那么您的答案质量会非常低。 - Tiago Martins Peres
1
谢谢,@TiagoMartinsPeres - Dima Zhylko

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