Jupyter笔记本中的Matplotlib图表在导出PDF时丢失。

10

在jupyter notebook中生成PDF时,一切都很好,但我想将内联图像保留在PDF中,同时也要保留notebook。

这是我的代码:

%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import set_matplotlib_formats
set_matplotlib_formats('png', 'pdf')

save_figures = True

x = np.arange(0, 20, 0.1)
y = np.sin(x)
plt.figure()
plt.plot(x, y)
if save_figures:
    plt.savefig('test.png')
plt.show()

这些数字呈现为内联,但在PDF中打印出的是:

<IPython.core.display.Javascript object>

<IPython.core.display.HTML object>

如果我从网页导出或使用nbconvert命令行导出到pdf,则相同的问题也出现在pdf中。

是否需要调用其他命令以使其正常工作?


1
我遇到了相同的问题。 我想用它进行3D绘图来调整视角等,因此%matplotlib inline对我来说不是一个选择。 这个问题会有修复吗? - DaPhil
报告了一个错误:https://github.com/jupyter/notebook/issues/3295 - Jay M
2个回答

14

如果你将%matplotlib notebook改为%matplotlib inline,那么使用jupyter的nbconvert进行PDF导出对我来说没问题。 %matplotlib notebook的魔法函数以交互方式呈现图表,我怀疑LaTeX无法正确识别它,而在PDF转换期间使用了LaTeX。

或者,如果你必须使用%matplotlib notebook,则使用jupyter的nbconvert进行HTML导出(jupyter nbconvert --to='html' Test.ipynb)似乎可以保留图表。然后我能够从Web浏览器打印这个HTML文件到PDF中,最终的PDF上会显示图表。


太好了!没错,交互式图似乎无法呈现,但使用“inline”可以正常工作。谢谢! - areth
1
你知道是否有一种方法可以通过命令行覆盖%matplotlib notebook,以便导出静态图像而不是交互式图像吗? - Tom
%matplotlib inline 对我很有用。 - wander95

5

交互问题的简单解决方案:在交互函数中将图形保存到文件中。

fig.savefig("pieCharts.png")

在下一个单元格中显示文件:

from IPython.display import Image
Image("pieCharts.png")

在PDF中,只有第二行的输出会显示为互动功能中更改的图像。


这对我来说在PDF导出方面很有效,并且解决了笔记本文件大小和图像缓存的问题。 - phhu

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