【问题标题】:I can not save a plot in pdf format using Matplotlib我无法使用 Matplotlib 以 pdf 格式保存绘图
【发布时间】:2023-03-09 16:02:01
【问题描述】:

我在一个使用 MatplotLib 绘制和保存简单图形的项目中工作。但是自从上次更新 Windows 以来,如果我使用 Latex 格式的文本,我无法将图片保存为 pdf 格式。请参阅下面的 Spyder 绘图试验:

import numpy as np
from matplotlib import pyplot as plt

# Data for plot
step = 0.001
x = np.arange(0, 2 + step, step)
y = x*x*np.cos(10*x)

plt.rc('text', usetex=True)
plt.rc('font', family='serif')

plt.figure(figsize=(19.2, 10.8))
plt.plot(x, y, lw=2)
plt.title(r'Function $f(x) = x^2 \cos(10x)$')
plt.savefig('plot.pdf', bbox_inches='tight')
plt.show()
plt.close()

此代码生成以下错误:

Traceback (most recent call last):

  File "<ipython-input-25-375950fa7d9a>", line 1, in <module>
    runfile('C:/Users/Fábio/Desktop/plotter.py', wdir='C:/Users/Fábio/Desktop')

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Fábio/Desktop/plotter.py", line 15, in <module>
    plt.savefig('plot.pdf', bbox_inches='tight')

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 701, in savefig
    res = fig.savefig(*args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\figure.py", line 1834, in savefig
    self.canvas.print_figure(fname, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backend_bases.py", line 2216, in print_figure
    **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backends\backend_pdf.py", line 2592, in print_pdf
    self.figure.draw(renderer)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\figure.py", line 1299, in draw
    renderer, self, artists, self.suppressComposite)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 2437, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
    a.draw(renderer)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axis.py", line 1138, in draw
    tick.draw(renderer)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axis.py", line 282, in draw
    self.label1.draw(renderer)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\text.py", line 762, in draw
    mtext=mtext)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backends\backend_pdf.py", line 1944, in draw_tex
    pdfname = self.file.dviFontName(dvifont)

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backends\backend_pdf.py", line 688, in dviFontName
    psfont = self.texFontMap[dvifont.texname]

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backends\backend_pdf.py", line 673, in texFontMap
    dviread.find_tex_file('pdftex.map'))

  File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\dviread.py", line 1057, in find_tex_file
    return result.decode('ascii')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)

上面的代码在保存为不同格式(.png 和 .eps,例如)时没有任何问题,但使用 .pdf 时会崩溃。在更新 Windows 之前,对 Latex 和 Python 使用相同的配置,此保存功能非常适合保存在 .pdf 中。

所以如果可能的话,我请求你帮我解决这个问题。

Ps.:示例代码在 Spyder 3.2.6 和 Python 3.6.4 中进行了测试。使用的 Latex 工作区包含来自 Miktex 的基础包,非常适合将文档保存为 .pdf 或将 .png / .eps 图形转换为 .pdf

事不宜迟,非常感谢您的关注。

【问题讨论】:

    标签: python pdf matplotlib latex


    【解决方案1】:

    这很可能是由于您的 Windows 用户名文件夹包含特定国家/地区的字符 (á)。

    return result.decode('ascii') 无法对此进行解码,并且不会生成指向您的 .tfm-files 的有效路径,其中包含 matlibplot 生成乳胶字体所需的所有信息。

    通过将 matlibplot 库中的 divread.py 文件更改为 result.decode('utf-8') ,应该可以解决问题。我不知道这是否会破坏任何其他依赖项,但它对我来说效果很好。

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 2022-06-17
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      相关资源
      最近更新 更多