2013-02-27 3 views
0

Я хочу создать исполнителя в matplotlib, который может нарисовать форму compound, которая включает текст и изображения, инкапсулированные в FancyBboxPatch. Я получил класс из вышеупомянутого FancyBboxPatch и переопределил метод «draw», но он, похоже, не работает.Переопределение matplotlib.artist.Artist для рисования сложной формы

То, что я пытаюсь достичь, - это объект, который можно вытащить с помощью matplotlib, но более сложный, чем простые доступные патчи; немного похоже на концепцию сложного виджета в графическом дизайне.

Вот что я пробовал:

class Cell(FancyBboxPatch): 

    def __init__(self, xy, width, height, **kwargs): 
     FancyBboxPatch.__init__(self, xy, width, height, **kwargs) 

    def draw(self, renderer): 
     print "Overridden draw method" 
     FancyBboxPatch.draw(self, renderer) 

     # Try drawing some simple patches and text: 
     r = Rectangle((set._x, self._y), self._width, self._height) 
     r.draw(renderer) # this doesn't draw 

     t = Annotation("hi", (self._x, self._y)) 
     t.draw(renderer) # this causes an error 

, но это не работает. Прямоугольник не нарисован, и в аннотации возникает ошибка: AttributeError: 'NoneType' object has no attribute 'transData'

У меня такое чувство, что я ошибаюсь! Могу ли я переопределить метод draw таким образом?

ТИА

+0

ли я даже буду об этом правильном пути? Вот как я мог бы подойти к проблеме при выполнении чего-то подобного в среде GUI, такой как Android/Gtk/Qt и т. Д. Может быть, это неправильный подход к matplotlib? Неужели я ошибаюсь? – ccbunney

ответ

0

Попробуйте это:

  • первый, вы должны попробовать, чтобы добавить * арг в инициализации Params и передать его также в FancyBboxPatch. init
  • При переопределении рисунка вы должны вызвать оригинальную ничью, после (или befre) вы закончите с изменениями, потому что могут быть некоторые внутренние методы, которые он вызывает, о которых вы не знаете, проверьте исходный код для FancyBboxPatch .draw

http://matplotlib.sourcearchive.com/documentation/0.99.3-1/patches_8py-source.html

Как я могу видеть, FancyBboxPatch подкласс патч, который является подклассом художника, как Patch и Исполнитель имеют методы рисовать, так что вы не можете просто переопределить их, не вызывая первоначальный метод

EDIT: Я супер слепой, извините за это, вы называете метод draw, однако неплохо добавить * args и ** kwargs к любым сложным методам. Попробуйте это и, возможно, позвоните в FancyBboxPatch.draw в конце метода переопределения

+0

Добавление * args и перемещение метода рисования до конца переопределенной ничьей не имело никакого значения ... – ccbunney

0

Существует разница в синтаксисе при переопределении class methods и instance methods. Это может помочь вам решить проблему. Вызов для метода перегруженного «рисовать» должен, таким образом, быть:

super(Cell,self).draw(renderer) 

То же самым для вашего конструктора:

super(Cell,self).__init__(xy, width, height, **kwargs) 
Смежные вопросы