在Jupyter Notebook中展示和保存PGF绘图

6

我已经准备了一个带有多个matplotlib图形的Jupyter Notebook。现在我想将这些图形保存为PGF格式,以便在LaTeX中重复使用它们。我遵循了这篇博客文章来实现这个想法。

不幸的是,如果我配置matplotlib生成PGF文件,它们就无法显示在Notebook中。如果我禁用matplotlib生成PGF文件,图形就会显示,但是PGF文件不会生成。我该如何同时实现两者呢?

下面是一个最小示例来重现此问题:

# Test if integration between python and latex works fine
import subprocess; subprocess.check_call(["latex", "-help"])

# Configure matplotlib to generate PGF files
import matplotlib
import matplotlib.pyplot as plt 
matplotlib.use("pgf")
matplotlib.rcParams.update({
    "pgf.texsystem": "pdflatex",
    'font.family': 'serif',
    'text.usetex': True,
    'pgf.rcfonts': False,
})

# Prepare simple plot
import pandas as pd
df = pd.DataFrame({
     'length': [1.5, 0.5, 1.2, 0.9, 3],
     'width': [0.7, 0.2, 0.15, 0.2, 1.1]
     }, index= ['pig', 'rabbit', 'duck', 'chicken', 'horse'])
hist = df.hist(bins=3)

# Save the plot to PGF file
plt.savefig('histogram.pgf')

这是启用matplotlib配置的输出结果。生成并保存了histogram.pgf文件,但图形未显示。 启用配置后 这是禁用PGF导出的matplotlib配置示例。图形已显示,但生成的histogram.pgf文件为空---不包含图形。 在此输入图片描述

@JasonChia histogram.pgf已经生成,但是在Jupyter Notebook中没有显示出来。我已经添加了一张截图。 - dzieciou
@JasonChia 在这种情况下没有帮助。我添加了另一个截图,显示当禁用PGF配置时绘制是生成的。 - dzieciou
1
仔细阅读博客文章后,我认为pgf格式不可能以图形方式呈现在pyplot中,因为它是一种特定于latex的格式。您能否将图形加载到latex中?我相信该博客描述了在从latex获取线宽度后调整图形的宽度和高度。这可能暗示了在使用pgf格式时无法可视化图形。也请查看此链接:https://matplotlib.org/3.1.1/tutorials/text/pgf.html - Jason Chia
2
如果在单独的单元格中调用 plt.something,它默认不会记住以前的 pyplot 状态。因此,无论是否存在 pgf 问题,要么将 plt.savefig 放在创建图形的同一单元格中,要么使用 fig.savefig,其中 fig 是要保存的图形。了解这一点后,也许您可以编辑问题以摆脱这个旁枝问题。 - ImportanceOfBeingErnest
1
@ImportanceOfBeingErnest 哇!谢谢。 (1) 在创建图形的同一单元格中保留 plt.savefig + (2) 删除 matplotlib.use("pgf")matplotlib.rcParams.update(... 行有所帮助。尽管没有明确告诉 matplotlib 使用 PGF 后端,但图形正确保存到 PGF 文件并在 LaTeX 中正确呈现。 - dzieciou
显示剩余4条评论
2个回答

1

不要使用 matplotlib.use("pgf"); 有一种替代方法可以实现相同的功能,而无需承受无法显示图表的缺点:

from matplotlib.backends.backend_pgf import FigureCanvasPgf
matplotlib.backend_bases.register_backend('pdf', FigureCanvasPgf)

这种方法使您能够继续使用常规的交互式后端,同时能够使用plt.savefig('figure.pdf')1保存已编译的PDF文件,并在保存文件后内联显示图形。

您仍然可以设置pgf参数。没有必要将它们删除,因为它们不会干扰交互式后端:

matplotlib.rcParams.update({
    "pgf.texsystem": "pdflatex",
    'pgf.rcfonts': False,
})

1
作为这个回答的作者,我也在想同样的问题。这确实是帮助我解决此问题的方法,也是官方文档推荐的方法。也许我的第一句话的措辞似乎有点贬低,但事实并非如此。你真的不应该使用它,因为有更好的替代方案。让我稍微改一下措辞,或许可以帮助未来的读者。 - gijswijs

0

我无法重现你的问题

enter image description here

enter image description here

我不得不运行第一个单元格三到四次,否则我看不到图形。

%matplotlib inline

顺便说一下,我正在使用Ubuntu 16.04,Python 3.7.6和Matplotlib 3.1.1。


有趣的。在我的情况下,我在评论中描述了两件有帮助的事情:https://dev59.com/gbjoa4cB1Zd3GeqPFdfj?noredirect=1#comment106093852_59892762 - dzieciou

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