覆盖matplotlib.artist.Artist来绘制复杂的形状

时间:2013-02-27 14:07:58

标签: python matplotlib

我想在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

2 个答案:

答案 0 :(得分:0)

试试这个:

  • 首先,您应该尝试将* args添加到 init 参数中,并将其传递到FancyBboxPatch。 init
  • 当覆盖绘制时,你应该调用原始绘图,之后(或者说)你完成了你的更改,因为它可能会调用一些你不知道的内部方法,检查FancyBboxPatch.draw的源代码< / LI>

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 methodsinstance methods时,语法会有所不同。它可能会帮助您解决问题。要求被覆盖的&#34;绘制&#34;因此,方法应该是:

super(Cell,self).draw(renderer)

您的构造函数也是如此:

super(Cell,self).__init__(xy, width, height, **kwargs)