Python matplotlib UnicodeEncodeError при сбросе rcParams в интерактивном режиме - PullRequest
0 голосов
/ 04 сентября 2018

Python показывает UnicodeEncodeError при сбросе rcParams и использовании латекса в интерактивном режиме. Я использую PyCharm 2018.1.4 вместе с iPython 5.8. Версия Python 2.7.15, версия Matplotlib 2.2.2.

Ввод 1 создает график, но выдает UnicodeEncodeError:

Python 2.7.15 |Anaconda custom (64-bit)| (default, May  1 2018, 23:32:55) 
[GCC 7.2.0] on linux2

In[2]: import matplotlib.pyplot as plt
  ...: import numpy as np
  ...: 
  ...: plt.ion()
  ...: plt.rcParams['text.usetex'] = True
  ...: 
  ...: x = np.linspace(-10,10,1000) * 2*np.pi
  ...: y = np.sin(x) * 10**(-10)
  ...: 
  ...: plt.plot(x,y)
  ...: plt.savefig('/home/proxauf/test_unicode1.png')
  ...: plt.close()
  ...: 
  ...: plt.rcParams['text.usetex'] = False
  ...: 
  ...: print "plot 1 successful"
  ...: 

Выход 1:

Backend Qt5Agg is interactive backend. Turning interactive mode on.
plot 1 successful
Traceback (most recent call last):
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/backends/backend_qt5.py", line 519, in _draw_idle
    self.draw()
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 433, in draw
    self.figure.draw(self.renderer)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/figure.py", line 1475, in draw
    renderer, self, artists, self.suppressComposite)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/image.py", line 141, in _draw_list_compositing_images
    a.draw(renderer)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 2607, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/image.py", line 141, in _draw_list_compositing_images
    a.draw(renderer)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/axis.py", line 1192, in draw
    renderer)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/axis.py", line 1130, in _get_tick_bboxes
    extent = tick.label1.get_window_extent(renderer)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/text.py", line 922, in get_window_extent
    bbox, info, descent = self._get_layout(self._renderer)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/text.py", line 309, in _get_layout
    ismath=ismath)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/backends/backend_agg.py", line 232, in get_text_width_height_descent
    s, fontsize, renderer=self)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/texmanager.py", line 501, in get_text_width_height_descent
    dvifile = self.make_dvi(tex, fontsize)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/texmanager.py", line 361, in make_dvi
    texfile = self.make_tex(tex, fontsize)
  File "/scratch/seismo/proxauf/conda/lib/python2.7/site-packages/matplotlib/texmanager.py", line 259, in make_tex
    fh.write(s.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2212' in position 230: ordinal not in range(128)

Ввод 2 создает график без ошибки:

In[3]: plt.rcParams['text.usetex'] = True
  ...: 
  ...: plt.plot(x,y)
  ...: plt.savefig('/home/proxauf/test_unicode2.png')
  ...: plt.close()
  ...: 
  ...: print "plot 2 successful"
  ...: 

Выход 2:

plot 2 successful

Я совсем не понимаю этого. В обоих случаях графики создаются в том виде, в каком они должны быть (в режиме Latex, см. Ниже), но в питоне Input 1 возникают проблемы при сбросе matplotlib rcParams. Однако сюжет может быть без проблем создан в нелатексном формате при text.usetex = False с самого начала. Что здесь происходит? Любые возможные исправления? Ошибка на самом деле не проблема (программа работает нормально), но неприятность, от которой я хочу избавиться.

Plot 1 (identical to plot 2)

Обновление: Ошибка появляется только при переключении (в пределах одного выполнения кода) с text.usetex = True на text.usetex = False и только при axes.unicode_minus = True. Другие направления или комбинации работают без проблем.

Обновление 2: Я воспроизвел ошибку при использовании iPython 5.8 вне PyCharm.

...