python - “TypeError:在使用 usetex:true 时,savefig 中需要一个类似字节的对象,而不是‘str’”
问题描述
在 matplotlib 中使用带有 text.usetex:true 的 savefig 时,我得到TypeError: a bytes-like object is required, not 'str'
编辑:我的解决方案是将 matplotlib 从 2.1.0 升级到 3.0.2
我可以使用 usetex:true 保存为 png 格式,但不能保存为 pdf 格式。我可以使用 usetex:false 保存为 pdf。这是产生错误所需的最少代码:
import matplotlib as mpl
mpl.use('pdf')
import matplotlib.pyplot as plt
mpl.rcParams['text.usetex'] = True
fig, axes = plt.subplots(1, 1)
fig.savefig('test.pdf')
我安装了 Miktex 2.9,以及此处提到的 dvipng 和 Ghostscript 的最新版本:https ://matplotlib.org/tutorials/text/usetex.html?highlight=usetex
我在路径中添加了以下内容:
C:\Program Files\gs\gs9.26\bin
C:\Program Files\MiKTeX 2.9\miktex\bin\x64
我正在使用 Windows 10、Python 3.6.3 和 matplotlib 2.1.0。
我还尝试删除我的 .matplotlib/tex.cache 目录,但没有成功。
完整追溯:
File ".\usetex.py", line 9, in <module>
fig.savefig('test.pdf')
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\figure.py", line 1814, in savefig
self.canvas.print_figure(fname, **kwargs)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\backend_bases.py", line 2259, in print_figure
**kwargs)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\backends\backend_pdf.py", line 2592, in print_pdf
self.figure.draw(renderer)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
return draw(artist, renderer, *args, **kwargs)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\figure.py", line 1295, in draw
renderer, self, artists, self.suppressComposite)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
a.draw(renderer)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
return draw(artist, renderer, *args, **kwargs)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\axes\_base.py", line 2399, in draw
mimage._draw_list_compositing_images(renderer, self, artists)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\image.py", line 138, in _draw_list_compositing_images
a.draw(renderer)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
return draw(artist, renderer, *args, **kwargs)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\axis.py", line 1138, in draw
tick.draw(renderer)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
return draw(artist, renderer, *args, **kwargs)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\axis.py", line 282, in draw
self.label1.draw(renderer)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
return draw(artist, renderer, *args, **kwargs)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\text.py", line 799, in draw
mtext=mtext)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\backends\backend_pdf.py", line 1944, in draw_tex
pdfname = self.file.dviFontName(dvifont)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\backends\backend_pdf.py", line 688, in dviFontName
psfont = self.texFontMap[dvifont.texname]
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\dviread.py", line 866, in __getitem__
fn = find_tex_file(fn)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\dviread.py", line 1045, in find_tex_file
stderr=subprocess.PIPE)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\subprocess.py", line 709, in __init__
restore_signals, start_new_session)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\subprocess.py", line 971, in _execute_child
args = list2cmdline(args)
File "C:\Users\bob\AppData\Local\Programs\Python\Python36-32\lib\subprocess.py", line 461, in list2cmdline
needquote = (" " in arg) or ("\t" in arg) or not arg
TypeError: a bytes-like object is required, not 'str'
解决方案
感谢@ImportanceOfBeingErnest,我将 matplotlib 从 2.1.0 升级到 3.0.2,并且错误不再出现。
推荐阅读
- c++ - _Pass_fn :构造函数在哪里?
- nginx - 为每个服务配置不同路径重写的 Kubernetes Traefik Ingress
- c# - Excel 互操作字符串到日期格式
- java - 通过经验点相关性计算数字
- ios - 如何将 UIDocumentPickerViewcontroller 文件上传到 AWS S3 TransferUtility Swift
- csv - 渲染 EJS 视图中的 Mongoose 对象到 CSV
- c# - 获取 maxJsonLength 属性错误
- git - GIT:无法从仓库中删除文件
- ssh - `gcloud app instances ssh` 命令禁用 SSH 主机密钥检查
- codeigniter - 使用 SMTP 发送电子邮件,无需用户名和密码