Python 3.x 将matplotlib图形保存为pdf时出错:';str';对象没有属性';解码';
我使用以下脚本使用matplotlib生成地物:Python 3.x 将matplotlib图形保存为pdf时出错:';str';对象没有属性';解码';,python-3.x,matplotlib,unicode,latex,Python 3.x,Matplotlib,Unicode,Latex,我使用以下脚本使用matplotlib生成地物: # -*- coding: utf-8 -*- import matplotlib.pyplot as plt import numpy as np import math from matplotlib import rc rc('font',**{'family':'serif'}) rc('text', usetex=True) rc('text.latex',unicode=True) rc('text.latex',preamble
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import math
from matplotlib import rc
rc('font',**{'family':'serif'})
rc('text', usetex=True)
rc('text.latex',unicode=True)
rc('text.latex',preamble=r'\usepackage[utf8]{inputenc}')
rc('text.latex',preamble=r'\usepackage[russian]{babel}')
def figsize(wcm,hcm): plt.figure(figsize=(wcm/2.54,hcm/2.54))
figsize(13,9)
x = np.linspace(0,2*math.pi,100)
y = np.sin(x)
plt.plot(x,y,'-')
plt.xlabel(u"Ось абсцисс")
plt.show()
它工作正常,图形渲染正确。但当我试图将其保存为pdf时,会出现以下错误:
Traceback (most recent call last):
File "C:\Path\rus pics\___test_rus.py", line 22, in <module>
plt.savefig(u"c:/fig.pdf")
File "C:\Python35\lib\site-packages\matplotlib\pyplot.py", line 688, in savefig
res = fig.savefig(*args, **kwargs)
File "C:\Python35\lib\site-packages\matplotlib\figure.py", line 1565, in savefig
self.canvas.print_figure(*args, **kwargs)
File "C:\Python35\lib\site-packages\matplotlib\backend_bases.py", line 2232, in print_figure
**kwargs)
File "C:\Python35\lib\site-packages\matplotlib\backends\backend_pdf.py", line 2536, in print_pdf
self.figure.draw(renderer)
File "C:\Python35\lib\site-packages\matplotlib\artist.py", line 61, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Python35\lib\site-packages\matplotlib\figure.py", line 1159, in draw
func(*args)
File "C:\Python35\lib\site-packages\matplotlib\artist.py", line 61, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Python35\lib\site-packages\matplotlib\axes\_base.py", line 2324, in draw
a.draw(renderer)
File "C:\Python35\lib\site-packages\matplotlib\artist.py", line 61, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Python35\lib\site-packages\matplotlib\axis.py", line 1120, in draw
self.label.draw(renderer)
File "C:\Python35\lib\site-packages\matplotlib\artist.py", line 61, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Python35\lib\site-packages\matplotlib\text.py", line 792, in draw
mtext=mtext)
File "C:\Python35\lib\site-packages\matplotlib\backends\backend_pdf.py", line 1866, in draw_tex
psfont = self.tex_font_mapping(dvifont.texname)
File "C:\Python35\lib\site-packages\matplotlib\backends\backend_pdf.py", line 1568, in tex_font_mapping
return self.tex_font_map[texfont]
File "C:\Python35\lib\site-packages\matplotlib\dviread.py", line 701, in __getitem__
result = self._font[texname.decode('ascii')]
AttributeError: 'str' object has no attribute 'decode'
回溯(最近一次呼叫最后一次):
文件“C:\Path\rus pics\\uuuuuu test\u rus.py”,第22行,在
plt.savefig(u“c:/fig.pdf”)
savefig中第688行的文件“C:\Python35\lib\site packages\matplotlib\pyplot.py”
res=图savefig(*args,**kwargs)
savefig中的文件“C:\Python35\lib\site packages\matplotlib\figure.py”,第1565行
self.canvas.print_图(*args,**kwargs)
文件“C:\Python35\lib\site packages\matplotlib\backend\u base.py”,第2232行,如图所示
**kwargs)
文件“C:\Python35\lib\site packages\matplotlib\backends\backend\u pdf.py”,第2536行,以print\u pdf格式
self.figure.draw(渲染器)
文件“C:\Python35\lib\site packages\matplotlib\artist.py”,第61行,在draw\u包装中
绘制(艺术家、渲染器、*args、**kwargs)
文件“C:\Python35\lib\site packages\matplotlib\figure.py”,第1159行,在绘图中
func(*args)
文件“C:\Python35\lib\site packages\matplotlib\artist.py”,第61行,在draw\u包装中
绘制(艺术家、渲染器、*args、**kwargs)
文件“C:\Python35\lib\site packages\matplotlib\axes\\u base.py”,第2324行,在绘图中
a、 绘制(渲染器)
文件“C:\Python35\lib\site packages\matplotlib\artist.py”,第61行,在draw\u包装中
绘制(艺术家、渲染器、*args、**kwargs)
文件“C:\Python35\lib\site packages\matplotlib\axis.py”,第1120行,在绘图中
self.label.draw(渲染器)
文件“C:\Python35\lib\site packages\matplotlib\artist.py”,第61行,在draw\u包装中
绘制(艺术家、渲染器、*args、**kwargs)
文件“C:\Python35\lib\site packages\matplotlib\text.py”,第792行,在绘图中
多行文字=多行文字)
文件“C:\Python35\lib\site packages\matplotlib\backends\backend\u pdf.py”,第1866行,绘图文本
psfont=self.tex\u font\u映射(dvifont.texname)
文件“C:\Python35\lib\site packages\matplotlib\backends\backend\u pdf.py”,第1568行,采用tex\u字体\u映射
返回self.tex\u font\u映射[texfont]
文件“C:\Python35\lib\site packages\matplotlib\dviread.py”,第701行,在\uu getitem中__
结果=self.\u字体[texname.decode('ascii')]
AttributeError:“str”对象没有属性“decode”
只有在标签中使用西里尔字母时才会出现错误。使用被证明是一个很好的解决方法。它有自己的问题(例如,Xeletex在带有fill\u的图形上失败,介于
之间),但它仍然允许在标签中获取西里尔字母
# -*- coding: utf-8 -*-
from __future__ import (absolute_import, division, print_function, unicode_literals)
import matplotlib as mpl
mpl.use("pgf")
pgf_with_custom_preamble = {
"font.family": "serif", # use serif/main font for text elements
"text.usetex": True, # use inline math for ticks
"pgf.rcfonts": False, # don't setup fonts from rc parameters
"pgf.preamble": [
"\\usepackage{units}", # load additional packages
"\\usepackage{metalogo}",
"\\usepackage{unicode-math}", # unicode math setup
r"\setmathfont{xits-math.otf}",
r"\setmainfont{DejaVu Serif}", # serif font via preamble
]
}
mpl.rcParams.update(pgf_with_custom_preamble)
import matplotlib.pyplot as plt
import numpy as np
import math
def figsize(wcm,hcm): plt.figure(figsize=(wcm/2.54,hcm/2.54))
figsize(13,9)
x = np.linspace(0,2*math.pi,100)
y = np.sin(x)
plt.plot(x,y,'-')
plt.xlabel(u"Ось абсцисс")
#plt.show()
plt.savefig(u"d:/fig.pdf")
通过安装缺少larm1200字体的cm super软件包解决了此问题。Matplotlib开发人员,感谢您的帮助 请使用
**{'family':'seif'}显示整个回溯消息
似乎有点傻,因为您可以指定关键字,就像:`rc('font',family='serif')将完整的回溯报告作为错误添加