2016-05-30 84 views
1

我有以下脚本来生成与matplotlib一个数字:错误节省matplotlib的数字为pdf:“STR”对象有没有属性“解码”

# -*- 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' 

只有当我使用标签西里尔字母的错误出现。

+0

请使用'** {'family':'seif'}显示整个回溯信息 –

+0

似乎有点傻,因为您可以指定关键字,就像:'rc('font',family ='serif' ) –

+0

添加完整跟踪 –

回答

1

使用XeLaTex原来是一个很好的解决方法。它有它自己的问题(例如,XeLaTex在fill_between的数字上失败),但它仍允许在标签中得到西里尔字母。

# -*- 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") 
1

该问题已通过安装缺少larm1200字体的cm-super软件包解决。 Matplotlib开发人员,感谢您的帮助!

相关问题