2013-09-04 3 views
0

Я очень устал обо всех этих проблемах с Юникодом. Мне нужно построить график с узлами объекта. И мне нужно показать этот график. У меня проблемы с визуализацией строк unicode. Итак ... Для того, чтобы объект в качестве узла графа, мне нужно переопределить равноправные и хэш-методыУзлы объектов Matplotlib, unicode __str___

class VkUser: 
    def __init__(self,uid=None,f_name = None,l_name = None,json=None): 
     if(json==None): 
      self.uid=uid 
      self.l_name=l_name 
      self.f_name=f_name 
     else: 
      self.uid = json['uid'] 
      self.f_name = json['first_name'] 
      self.l_name = json['last_name'] 
    def __eq__(self, other): 
     if isinstance(other, VkUser): 
      return (self.uid == other.uid) 
     return NotImplemented 
    def __ne__(self, other): 
     result = self.__eq__(other) 
     if result is NotImplemented: 
      return result 
     return not result 
    def __hash__(self): 
     return hash(self.uid) 

Но, если я хочу, чтобы не указатели, как узлы графа, мне нужно переопределить ул

def __str__(self): 
     return '%s %s'%(self.f_name,self.l_name) 

Он отлично работает, а у меня только английские буквы.

Но у меня есть вход Json с русскими буклетами unicode, и мне нужно показать их на графике. Somethisg как

Me = VkUser(111,u'\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440',u'\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440') 

А теперь у меня собственной ошибки

label=str(label) # this will cause "1" and 1 to be labeled the same 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128) 

Я пробовал разные варианты в ул

Защиту ул (Я): возвращение и '% s % s '% (self.f_name, self.l_name) Те же ошибки

def __str__(self): 
     res = u'%s %s'%(self.f_name,self.l_name) 
     return res.encode('utf-8') 
... 
ValueError: matplotlib display text must have all code points < 128 or use Unicode strings 

Помогите мне, пожалуйста, я устал от этого.

+0

какая версия mpl и python вы используете? Попробуйте избавиться от 'str', вот что пытается преобразовать его в ascii. И можете ли вы объединить свой код с минимальным примером? http://sscce.org/ – tacaswell

ответ

0
l = u'\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440' 
plot(range(5), label=l) 
legend() 

Ведет себя, как я ожидал (ну, у меня нет шрифта для тех символов, так что я получаю коробки) с 2,7 и почти током мастера (1.4.x).