2017-02-21 31 views
0

我想在ipython筆記本中的matplotlib圖中繪製unicode字符。matplotlib圖中的Unicode文本在ipython中給出了錯誤

# For example: 
plt.title("α") 

但是,它給出了UnicodeEncodeError。 我已經嘗試導入unicode_literals模塊,如matplotlib文檔中的建議:http://matplotlib.org/examples/text_labels_and_annotations/unicode_demo.html。 我也嘗試使用一個Unicode代碼字符串與plt.title(u"α"),建議在這裏:Unicode in ipython notebook

這兩種方法都沒有影響錯誤輸出(我把它放在底部)。

如何獲得unicode字符串在ipython筆記本中繪製matplotlib?

我對這種情況下使用LaTeX不感興趣,如果沒問題。

--------------------------------------------------------------------------- 
UnicodeEncodeError      Traceback (most recent call last) 
/usr/local/lib/python3.5/site-packages/IPython/core/formatters.py in __call__(self, obj) 
    305     pass 
    306    else: 
--> 307     return printer(obj) 
    308    # Finally look for special method names 
    309    method = get_real_method(obj, self.print_method) 

/usr/local/lib/python3.5/site-packages/IPython/core/pylabtools.py in <lambda>(fig) 
    225 
    226  if 'png' in formats: 
--> 227   png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs)) 
    228  if 'retina' in formats or 'png2x' in formats: 
    229   png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs)) 

/usr/local/lib/python3.5/site-packages/IPython/core/pylabtools.py in print_figure(fig, fmt, bbox_inches, **kwargs) 
    117 
    118  bytes_io = BytesIO() 
--> 119  fig.canvas.print_figure(bytes_io, **kw) 
    120  data = bytes_io.getvalue() 
    121  if fmt == 'svg': 

/usr/local/lib/python3.5/site-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs) 
    2178      orientation=orientation, 
    2179      dryrun=True, 
-> 2180      **kwargs) 
    2181     renderer = self.figure._cachedRenderer 
    2182     bbox_inches = self.figure.get_tightbbox(renderer) 

/usr/local/lib/python3.5/site-packages/matplotlib/backends/backend_agg.py in print_png(self, filename_or_obj, *args, **kwargs) 
    525 
    526  def print_png(self, filename_or_obj, *args, **kwargs): 
--> 527   FigureCanvasAgg.draw(self) 
    528   renderer = self.get_renderer() 
    529   original_dpi = renderer.dpi 

/usr/local/lib/python3.5/site-packages/matplotlib/backends/backend_agg.py in draw(self) 
    472 
    473   try: 
--> 474    self.figure.draw(self.renderer) 
    475   finally: 
    476    RendererAgg.lock.release() 

/usr/local/lib/python3.5/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs) 
    60  def draw_wrapper(artist, renderer, *args, **kwargs): 
    61   before(artist, renderer) 
---> 62   draw(artist, renderer, *args, **kwargs) 
    63   after(artist, renderer) 
    64 

/usr/local/lib/python3.5/site-packages/matplotlib/figure.py in draw(self, renderer) 
    1157   dsu.sort(key=itemgetter(0)) 
    1158   for zorder, a, func, args in dsu: 
-> 1159    func(*args) 
    1160 
    1161   renderer.close_group('figure') 

/usr/local/lib/python3.5/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs) 
    60  def draw_wrapper(artist, renderer, *args, **kwargs): 
    61   before(artist, renderer) 
---> 62   draw(artist, renderer, *args, **kwargs) 
    63   after(artist, renderer) 
    64 

/usr/local/lib/python3.5/site-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe) 
    2317 
    2318   for zorder, a in dsu: 
-> 2319    a.draw(renderer) 
    2320 
    2321   renderer.close_group('axes') 

/usr/local/lib/python3.5/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs) 
    60  def draw_wrapper(artist, renderer, *args, **kwargs): 
    61   before(artist, renderer) 
---> 62   draw(artist, renderer, *args, **kwargs) 
    63   after(artist, renderer) 
    64 

/usr/local/lib/python3.5/site-packages/matplotlib/text.py in draw(self, renderer) 
    747 
    748   with _wrap_text(self) as textobj: 
--> 749    bbox, info, descent = textobj._get_layout(renderer) 
    750    trans = textobj.get_transform() 
    751 

/usr/local/lib/python3.5/site-packages/matplotlib/text.py in _get_layout(self, renderer) 
    359     w, h, d = renderer.get_text_width_height_descent(clean_line, 
    360               self._fontproperties, 
--> 361               ismath=ismath) 
    362    else: 
    363     w, h, d = 0, 0, 0 

/usr/local/lib/python3.5/site-packages/matplotlib/backends/backend_agg.py in get_text_width_height_descent(self, s, prop, ismath) 
    227    fontsize = prop.get_size_in_points() 
    228    w, h, d = texmanager.get_text_width_height_descent(s, fontsize, 
--> 229                renderer=self) 
    230    return w, h, d 
    231 

/usr/local/lib/python3.5/site-packages/matplotlib/texmanager.py in get_text_width_height_descent(self, tex, fontsize, renderer) 
    673   else: 
    674    # use dviread. It sometimes returns a wrong descent. 
--> 675    dvifile = self.make_dvi(tex, fontsize) 
    676    dvi = dviread.Dvi(dvifile, 72 * dpi_fraction) 
    677    try: 

/usr/local/lib/python3.5/site-packages/matplotlib/texmanager.py in make_dvi(self, tex, fontsize) 
    397 
    398   if DEBUG or not os.path.exists(dvifile): 
--> 399    texfile = self.make_tex(tex, fontsize) 
    400    outfile = basefile + '.output' 
    401    command = self._get_shell_cmd(

/usr/local/lib/python3.5/site-packages/matplotlib/texmanager.py in make_tex(self, tex, fontsize) 
    312    else: 
    313     try: 
--> 314      fh.write(s.encode('ascii')) 
    315     except UnicodeEncodeError as err: 
    316      mpl.verbose.report("You are using unicode and latex, but " 

UnicodeEncodeError: 'ascii' codec can't encode character '\xb0' in position 289: ordinal not in range(128) 
+0

對我來說''plt.title(「α」)'使用'unicode_literals'時效果很好。忽略未來的導入,'plt.title(u「α」)'也適用。所以我想你需要提供這個問題的[mcve]。特別是它似乎跟蹤了'texmanager.py'中的一些膠乳渲染,這表明你*實際上使用了Latex。這當然可能與unicode字符一起出現問題。 – ImportanceOfBeingErnest

回答

0

如果沒有一個完整的例子很難肯定地說這是怎麼回事,但我可以告訴你,我做了什麼,當我有一個類似的問題,我想這兩個蟒蛇2和Python 3爲未來的打樣運行。

在文件的標題:

#!/usr/bin/env python 
# coding: utf-8 
import six,sys 
# needed for utf-encoding on python 2: 
if six.PY2: 
    reload(sys) 
    sys.setdefaultencoding('utf8') 

注意,由PEP 0263標準規定的good reason,該# coding: utf-8線實際上是重要的,做一些事情。嘗試一下,看看是否修復它。如果沒有,提供一個完整的例子,我會相應地更新這個答案。

或者,嘗試將其更改爲plt.title(u'α')

0

感謝您的幫助amoose136。 但我設法弄清楚了。 有兩件事。

首先,我用的TeX做文字:

matplotlib.rc('text', usetex=True) 

TeX和Unicode的不要混用。

省略此行允許matplotlib文檔示例工作(在問題信息中)。第二,然後編譯,但我希望我的(希臘)字符顯示爲框。 爲了解決這個問題,我也跟着的建議在這裏:Non-ASCII characters in Matplotlib, 和使用那些支持我的角色,如Arial字體:

matplotlib.rc('font', family='Arial') 

希望這有助於任何人!

相關問題