2010-08-13 7 views
5

J'utilise python 2.6 et matplotlib. Si je lance l'exemple histogram_demo.py fourni dans la page de la galerie matplotlib, cela fonctionne correctement. J'ai simplifié ce script très:Erreur Unicode en utilisant matplotlib avec l'échelle log sur Windows

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() 

Je reçois cette erreur (à la ligne plt.show()):

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

J'ai essayé de changer le back-end à de nombreuses valeurs différentes - rien aide. J'utilise Qt4Agg. Est-ce un problème de police? Il semble que ça doit être quelque chose avec ma configuration. Note: En raison d'autres problèmes, je viens d'installer une nouvelle copie de python26, matplotlib, numpy, scipy. J'ai une autre XP-box exécutant python26 et il exécute les deux versions du script sans erreur. J'espère que quelqu'un peut aider. Merci d'avance.

+0

Pour tout ce que ça vaut, car cela dépend clairement du système, vous pourriez avoir plus de chance de le demander sur la liste des utilisateurs de matplotlib: https://lists.sourceforge.net/lists/listinfo/matplotlib-users –

+0

afficher aussi toute la traceback? –

Répondre

0

J'ai rencontré une erreur similaire aujourd'hui, concernant le code que je connais pour un fait qui fonctionnait il y a une semaine. J'ai également récemment désinstallé/réinstallé Matplotlib et Numpy, tout en vérifiant autre chose (j'utilise Python 2.5).

Le code quelque chose comme ceci:

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

Chaque fois qu'il a été exécuté avec self.logy comme vrai, il a échoué comme ci-dessus. Sinon, cela a parfaitement fonctionné.

J'ai fini par résoudre le problème en désinstallant Matplotlib et Numpy et en installant les dernières versions. Cependant, la version jetant l'erreur avait déjà été utilisée sans problème. C'est seulement après l'échange de l'ancienne version pour la plus récente et vice-versa que cela a commencé.

Peut-être que le processus de désinstallation/réinstallation perturbe certains aspects des fichiers de configuration.

Pour être complet, voici le retraçage complet donné:

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 
8

Ce bogue dans la gestion de la police de matplotlib, sur ma machine c'est le fichier /usr/lib/pymodules/python2.6/ matplotlib/font_manager.py: 1220. J'ai mis en évidence la modification dans l'extrait de code ci-dessous; ceci est corrigé dans la dernière version de 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 

Cette erreur se produit uniquement si aucune police "bonne" n'a été trouvée et que le gestionnaire de polices ne retombe à une police par défaut. Par conséquent, l'erreur est survenue sans raison apparente, probablement à cause de changements dans les polices installées.

Espérons que ça aide!

5

J'ai eu le même problème avec matplotlib 0.98.5.2. J'ai été capable de le réparer en passant à matplotlib 1.0.1 (0.99.3 ne fonctionnait pas), ou en soufflant mon répertoire ~/.matplotlib. Vous ne savez pas quel est l'équivalent pour Windows.

+3

se débarrasser de la ~/.matplotlib/fontList.cache résolu le problème pour moi. –

+0

Supprimer spécifiquement le fichier ~/.matplotlib/fontList.cache. Pas besoin de supprimer le dossier entier – naren

0

Merci d'avoir expliqué le problème!Depuis que j'utilise l'installation système de MacPlus 10.6 de matplotlib, (et je suis coincé sur Python2.5 en raison d'autres exigences de paquetage) je ne suis pas intéressé par la mise à niveau de matplotlib (je ne peux pas gérer tous les versioning des paquets open-source!)

Ainsi, la solution que je hasard essayé, qui a travaillé, était de modifier mon ~/.matplotlib/matplotlibrc et activer LaTex, en mettant text.usetex : True (car il a montré une longue liste des polices prises en charge, donc je pensais il pourrait être plus difficile de trouver une "bonne" police).

Pas vraiment une "correction", mais mon script fonctionnait avec un minimum de bricolage/temps d'arrêt.

Questions connexes