2010-08-13 33 views
5

Tôi đang sử dụng python 2.6 và matplotlib. Nếu tôi chạy mẫu histogram_demo.py được cung cấp trong trang thư viện matplotlib, nó hoạt động tốt. Tôi đã đơn giản hóa kịch bản này rất nhiều:Lỗi Unicode bằng cách sử dụng matplotlib với thang tỷ lệ trên 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() 

tôi nhận được lỗi này (tại dòng plt.show()):

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

Tôi đã cố gắng thay đổi phụ trợ với nhiều giá trị khác nhau - không có gì giúp. Tôi đang sử dụng Qt4Agg. Đây có phải là vấn đề về phông chữ không? Có vẻ như nó phải là một cái gì đó với cấu hình của tôi. Lưu ý: Bởi vì các vấn đề khác, tôi chỉ cần cài đặt một bản sao mới của python26, matplotlib, numpy, scipy. Tôi có một XP-box chạy python26 và nó thực hiện cả hai phiên bản của kịch bản mà không có lỗi. Tôi hy vọng ai đó có thể giúp đỡ. Rất cám ơn trước.

+0

Đối với bất kỳ giá trị nào, vì điều này rõ ràng là phụ thuộc vào hệ thống, bạn có thể có may mắn hơn khi yêu cầu điều này trong danh sách người dùng matplotlib: https://lists.sourceforge.net/lists/listinfo/matplotlib-users –

+0

Bạn có thể đăng cả traceback nữa? –

Trả lời

0

Tôi đã gặp phải lỗi tương tự ngày hôm nay, về mã mà tôi biết thực tế đã hoạt động cách đây một tuần. Tôi cũng vừa mới gỡ cài đặt/cài đặt lại cả Matplotlib và Numpy, trong khi kiểm tra cái gì khác (tôi đang sử dụng Python 2.5).

Mã này đã đi một cái gì đó như thế này:

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

Bất cứ khi nào nó được chạy với self.logy như True, nó thất bại như trên. Nếu không, nó hoạt động hoàn hảo tốt.

Tôi đã kết thúc bằng cách gỡ cài đặt Matplotlib và Numpy và cài đặt các phiên bản mới nhất của chúng. Tuy nhiên, phiên bản ném lỗi trước đó đã được sử dụng mà không có vấn đề gì. Chỉ sau khi trao đổi phiên bản cũ cho phiên bản mới hơn và ngược lại thì điều này đã bắt đầu xảy ra.

Có lẽ quá trình gỡ cài đặt/cài đặt lại sẽ làm rối loạn một số khía cạnh nhất định của tệp cấu hình.

Để hoàn chỉnh, đây là traceback hoàn chỉnh đưa ra:

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

Đây là một lỗi trong việc quản lý phông chữ của matplotlib, trên máy tính của tôi đây là file /usr/lib/pymodules/python2.6/ matplotlib/font_manager.py: 1220. Tôi đã đánh dấu sự thay đổi trong đoạn mã dưới đây; điều này được sửa trong phiên bản mới nhất của 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 

Lỗi này chỉ xảy ra nếu không tìm thấy phông chữ "tốt" và trình quản lý phông chữ rơi trở lại phông chữ mặc định. Do đó, lỗi xảy ra mà không có lý do rõ ràng, có thể do những thay đổi trong các phông chữ được cài đặt.

Hy vọng điều đó sẽ hữu ích!

5

Tôi gặp vấn đề tương tự với matplotlib 0.98.5.2. Tôi đã có thể sửa chữa nó bằng cách nâng cấp lên matplotlib 1.0.1 (0.99.3 không hoạt động), hoặc bằng cách thổi đi thư mục ~/.matplotlib của tôi. Bạn không chắc chắn tương đương với Windows.

+3

loại bỏ ~/.matplotlib/fontList.cache đã khắc phục sự cố cho tôi. –

+0

Cụ thể xóa tập tin ~/.matplotlib/fontList.cache. Không cần xóa toàn bộ thư mục – naren

1

tôi đã cùng một vấn đề ngày hôm nay, và tôi thấy vấn đề này trong github

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

Cách giải quyết đề xuất là để xóa các tập tin .matplotlib/fontList.cache, và làm việc cho tôi.

0

Cảm ơn bạn đã giải thích sự cố!

Vì tôi đang sử dụng hệ điều hành Mac OS 10.6 cài đặt của matplotlib, (và tôi bị mắc kẹt trên Python2.5 do yêu cầu gói khác) Tôi không quan tâm đến việc nâng cấp matplotlib (Tôi không thể xử lý tất cả phiên bản của gói mã nguồn mở!)

vì vậy, việc sửa chữa tôi đã cố gắng một cách ngẫu nhiên, mà làm việc, đã chỉnh sửa của tôi ~/.matplotlib/matplotlibrc và cho phép LaTex, bằng cách thiết lập text.usetex : True (vì nó cho thấy một danh sách dài các phông chữ được hỗ trợ, vì vậy tôi nghĩ nó có thể cố gắng hơn để tìm một phông chữ "tốt").

Không phải là "sửa lỗi" thực sự, nhưng có tập lệnh của tôi hoạt động với thời gian ngừng hoạt động tối thiểu/thời gian ngừng hoạt động.

Các vấn đề liên quan