我想在matplotlib中创建一个艺术家,可以绘制compound
形状,其中包含封装在FancyBboxPatch中的文本和图像。我从前面提到的FancyBboxPatch派生了一个类并重写了“draw”方法,但它似乎没有用。
我想要实现的是一个可以通过matplotlib绘制的对象,但它比可用的简单补丁更复杂;有点像GUI设计中复合小部件的概念。
以下是我的尝试:
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
方法吗?
TIA
答案 0 :(得分:0)
试试这个:
http://matplotlib.sourcearchive.com/documentation/0.99.3-1/patches_8py-source.html
正如我所看到的,FancyBboxPatch是Patch的子类,它是Artist的子类,Patch和Artist都有方法绘制,所以你不能简单地覆盖它们而不调用原始方法
编辑:我是超级盲人,对不起,你正在调用draw方法,但是将* args和** kwargs添加到任何重写方法是个好主意..尝试一下,也许可以调用FancyBboxPatch .draw在覆盖方法结束时拉出答案 1 :(得分:0)
覆盖class methods和instance methods时,语法会有所不同。它可能会帮助您解决问题。要求被覆盖的"绘制"因此,方法应该是:
super(Cell,self).draw(renderer)
您的构造函数也是如此:
super(Cell,self).__init__(xy, width, height, **kwargs)