2010-08-13 21 views
5

Estoy usando python 2.6 y matplotlib. Si ejecuto la muestra histogram_demo.py proporcionada en la página de la galería matplotlib, funciona bien. He simplificado en gran medida este script:Error Unicode usando matplotlib con escala de registro en 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() 

me sale este error (en la línea de plt.show()):

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

He intentado cambiar el backend para muchos valores diferentes - nada ayuda. Estoy usando Qt4Agg. ¿Esto es un problema de fuente? Parece que debe ser algo con mi configuración. Nota: Debido a otros problemas, acabo de instalar una copia nueva de python26, matplotlib, numpy, scipy. Tengo otro XP-box que ejecuta python26 y ejecuta ambas versiones del script sin errores. Espero que alguien pueda ayudar. Muchas gracias de antemano.

+0

Para lo que sea que valga la pena, ya que esto es claramente dependiente del sistema, es posible que tenga más suerte al pedir esto en la lista de usuarios matplotlib: https://lists.sourceforge.net/lists/listinfo/matplotlib-users –

+0

¿Podría usted publicar toda la traza inversa también? –

Respuesta

0

Experimenté un error similar hoy, con respecto al código que sé que funcionaba hace una semana. También he desinstalado/reinstalado recientemente Matplotlib y Numpy, mientras comprobaba algo más (estoy usando Python 2.5).

El código fue algo como esto:

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

Cada vez que se ejecuta con self.logy como verdadera, no logró que el anterior. De lo contrario, funcionó perfectamente bien.

Terminé solucionando el problema desinstalando Matplotlib y Numpy e instalando las últimas versiones de ellos. Sin embargo, la versión que arroja el error había sido utilizada previamente sin problemas. Solo después de cambiar la versión anterior por la más nueva y viceversa, comenzó esto.

Quizás el proceso de desinstalación/reinstalación arruine ciertos aspectos de los archivos de configuración.

Para completar, aquí está el rastreo completa dada:

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

Esto es un error en la gestión de fuentes de matplotlib, en mi máquina este es el archivo /usr/lib/pymodules/python2.6/ matplotlib/font_manager.py: 1220. He resaltado el cambio en el fragmento de código a continuación; esto se soluciona en la versión más nueva 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 

Este error ocurre solo si no se encuentra una fuente "buena" y el administrador de fuentes vuelve a una fuente predeterminada. Por lo tanto, el error ocurrió sin una razón aparente, probablemente debido a cambios en las fuentes instaladas.

Espero que ayude!

5

Tuve el mismo problema con matplotlib 0.98.5.2. Pude solucionarlo actualizando a matplotlib 1.0.1 (0.99.3 no funcionó), o eliminando mi directorio ~/.matplotlib. No estoy seguro de cuál es el equivalente para Windows.

+3

deshacerse de ~/.matplotlib/fontList.cache arregló el problema para mí. –

+0

Elimine específicamente el archivo ~/.matplotlib/fontList.cache. No es necesario eliminar toda la carpeta – naren

0

¡Gracias por explicar el problema!

Como uso la instalación del sistema Mac OS 10.6 de matplotlib, (y estoy atascado en Python2.5 debido a otros requisitos del paquete) no estoy interesado en actualizar matplotlib (simplemente no puedo manejar todas las versiones de los paquetes de código abierto!)

así que la solución probé al azar, que trabajaba, era editar mi ~/.matplotlib/matplotlibrc y permitir látex, mediante el establecimiento de text.usetex : True (ya que mostró una larga lista de fuentes admitidas, así que pensé podría intentar más difícil encontrar una fuente "buena").

No es una "solución" real, pero conseguí que mi script funcionara con un mínimo de retoques/tiempo de inactividad.

Cuestiones relacionadas