Ошибка Unicode при использовании matplotlib с масштабированием журнала в Windows - PullRequest
5 голосов
/ 13 августа 2010

Я использую Python 2.6 и Matplotlib.Если я запускаю образец histogram_demo.py, представленный на странице галереи matplotlib, он работает нормально.Я значительно упростил этот скрипт:

import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

fig = plt.figure()
ax = fig.add_subplot(111)

n, bins, patches = ax.hist(x, 50, normed=1, facecolor='green', alpha=0.75)

ax.set_yscale('log')  # <---- add this line to generate the error
plt.show()

Я получаю эту ошибку (в строке plt.show()):

TypeError: coercing to Unicode: need string or buffer, dict found

Я пытался изменить бэкэнд на множество различных значений- ничего не помогает.Я использую Qt4Agg.Это проблема со шрифтом?Кажется, это должно быть что-то с моей конфигурацией.Примечание: из-за других проблем я только что установил свежую копию python26, matplotlib, numpy, scipy.У меня есть еще один XP-бокс под управлением python26, и он выполняет обе версии скрипта без ошибок.Я надеюсь, что кто-то может помочь.Большое спасибо заранее.

Ответы [ 5 ]

8 голосов
/ 17 сентября 2010

Это ошибка в управлении шрифтами matplotlib, на моей машине это файл /usr/lib/pymodules/python2.6/matplotlib/font_manager.py:1220. Я выделил изменение в фрагменте кода ниже; это исправлено в новейшей версии matplotlib.

if best_font is None or best_score >= 10.0:
    verbose.report('findfont: Could not match %s. Returning %s' %
                       (prop, self.defaultFont))
    [+]result = self.defaultFont[fontext]
    [-]result = self.defaultFont
    print "defaultFont", result
else:
    verbose.report('findfont: Matching %s to %s (%s) with score of %f' %
                       (prop, best_font.name, best_font.fname, best_score))
    result = best_font.fname
    print "best_font", result

Эта ошибка возникает только в том случае, если «хороший» шрифт не найден и диспетчер шрифтов возвращается к шрифту по умолчанию. Поэтому ошибка возникла без видимой причины, возможно, из-за изменений в установленных шрифтах.

Надеюсь, это поможет!

5 голосов
/ 07 июля 2011

У меня была такая же проблема с matplotlib 0.98.5.2.Я смог исправить это путем обновления до matplotlib 1.0.1 (0.99.3 не сработало) или путем удаления моего каталога ~ / .matplotlibНе уверен, что эквивалент для Windows.

1 голос
/ 14 июля 2011

У меня была такая же проблема сегодня, и я нашел ее в github

https://github.com/matplotlib/matplotlib/issues/198

Предложенный обходной путь - удалить файл .matplotlib/fontList.cache, и он мне помог.1007 *

0 голосов
/ 13 марта 2012

Спасибо за объяснение проблемы!

Поскольку я использую системную установку Macp 10.6 для matplotlib (и я застрял на Python2.5 из-за других требований к пакету), я не заинтересован в обновлении matplotlib (я просто не могу справиться со всеми версиями пакетов с открытым исходным кодом!)

Так что исправление, которое я случайно попробовал, сработало, было редактировать мой ~/.matplotlib/matplotlibrc и включите LaTex, установив text.usetex : True (поскольку он показывает длинный список поддерживаемых шрифтов, поэтому я подумал, что может быть сложнее найти «хороший» шрифт).

Не настоящее "исправление", но мой скрипт работал с минимальными затратами времени / простоя.

0 голосов
/ 19 августа 2010

Сегодня я столкнулся с подобной ошибкой, касающейся кода, который, как я знаю, работал, неделю назад.Я также недавно удалил / переустановил Matplotlib и Numpy, проверяя что-то еще (я использую Python 2.5).

Код выглядел примерно так:

self.ax.cla()
if self.logy: self.ax.set_yscale('log')
self.canvas.draw()

Всякий раз, когда это былозапустить с self.logy как True, это не удалось, как указано выше.В остальном все работало идеально.

Я закончил работу над проблемой, удалив Matplotlib и Numpy и установив их последние версии.Однако версия, выдавшая ошибку, ранее использовалась без проблем.Это начало происходить только после замены старой версии на новую и обратно.

Возможно, процесс удаления / переустановки портит некоторые аспекты файлов конфигурации.

Для полноты здесьполный приведенный откат:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\path\to\file\being\called\by\Tkinter.py", line 1081, in refresh
    self.canvas.draw()
  File "C:\Python25\Lib\site-packages\matplotlib\backends\backend_tkagg.py", line 215, in draw
    FigureCanvasAgg.draw(self)
  File "C:\Python25\Lib\site-packages\matplotlib\backends\backend_agg.py", line 314, in draw
    self.figure.draw(self.renderer)
  File "C:\Python25\Lib\site-packages\matplotlib\artist.py", line 46, in draw_wrapper
    draw(artist, renderer, *kl)
  File "C:\Python25\Lib\site-packages\matplotlib\figure.py", line 773, in draw
    for a in self.axes: a.draw(renderer)
  File "C:\Python25\Lib\site-packages\matplotlib\artist.py", line 46, in draw_wrapper
    draw(artist, renderer, *kl)
  File "C:\Python25\Lib\site-packages\matplotlib\axes.py", line 1735, in draw
    a.draw(renderer)
  File "C:\Python25\Lib\site-packages\matplotlib\artist.py", line 46, in draw_wrapper
    draw(artist, renderer, *kl)
  File "C:\Python25\Lib\site-packages\matplotlib\axis.py", line 742, in draw
    tick.draw(renderer)
  File "C:\Python25\Lib\site-packages\matplotlib\artist.py", line 46, in draw_wrapper
    draw(artist, renderer, *kl)
  File "C:\Python25\Lib\site-packages\matplotlib\axis.py", line 196, in draw
    self.label1.draw(renderer)
  File "C:\Python25\Lib\site-packages\matplotlib\text.py", line 515, in draw
    bbox, info = self._get_layout(renderer)
  File "C:\Python25\Lib\site-packages\matplotlib\text.py", line 279, in _get_layout
    clean_line, self._fontproperties, ismath=ismath)
  File "C:\Python25\Lib\site-packages\matplotlib\backends\backend_agg.py", line 156, in get_text_width_height_descent
    self.mathtext_parser.parse(s, self.dpi, prop)
  File "C:\Python25\Lib\site-packages\matplotlib\mathtext.py", line 2797, in parse
    font_output = fontset_class(prop, backend)
  File "C:\Python25\Lib\site-packages\matplotlib\mathtext.py", line 658, in __init__
    self._stix_fallback = StixFonts(*args, **kwargs)
  File "C:\Python25\Lib\site-packages\matplotlib\mathtext.py", line 900, in __init__
    fullpath = findfont(name)
  File "C:\Python25\Lib\site-packages\matplotlib\font_manager.py", line 1306, in findfont
    if not os.path.exists(font):
  File "C:\Python25\lib\ntpath.py", line 255, in exists
    st = os.stat(path)
TypeError: coercing to Unicode: need string or buffer, dict found
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...