2017-02-21 26 views
0

Я пытаюсь нарисовать символы юникода на графике matplotlib в ноутбуке ipython.Юникод текст в графике matplotlib дает ошибку в 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 для построения в matplotlib в ноутбуке ipython?

Я не заинтересован в использовании 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. Конечно, это может быть проблемой вместе с символами юникода. – ImportanceOfBeingErnest

ответ

0

Без полного примера, трудно сказать наверняка, что происходит, но я могу вам сказать, что я сделал, когда я была аналогичная проблема, и я хотел, чтобы работать как на Python 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') 

Обратите внимание, что для good reason указанных зажигательного-0263 стандарта, то # coding: utf-8 линия на самом деле важна, и что-то делает. Попробуйте это и посмотрите, исправляет ли это. Если нет, укажите полный пример, и я соответствующим образом обновлю ответ.

В качестве альтернативы, попробуйте изменить его на plt.title(u'α').

0

Спасибо за помощь amoose136. Но мне удалось понять это. Было две вещи.

Во-первых, я использовал TeX, чтобы сделать текст:

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

TeX и юникод не смешиваются.

Опуская эту строку, можно привести пример работы matplotlib (в информации о вопросе).

Во-вторых, он был скомпилирован, но у меня были мои (греческие) персонажи, появляющиеся в виде ящиков. Чтобы это исправить, я последовал совет здесь: Non-ASCII characters in Matplotlib, и использовал шрифт, который поддерживал мои персонаж, как Arial:

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

Надеется, что это помогает кто-нибудь!

 Смежные вопросы

  • Нет связанных вопросов^_^