0

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

但这不起作用。矩形不会被绘制,并且 Annotation 会引发错误:AttributeError: 'NoneType' object has no attribute 'transData'

我觉得我做错了!我可以用draw这种方式覆盖该方法吗?

TIA

4

2 回答 2

0

尝试这个:

  • 首先,您应该尝试将 *args 添加到init参数中,并将其也传递给 FancyBboxPatch。在里面
  • 覆盖绘图时,您应该在完成更改之后(或之前)调用原始绘图,因为它可能调用了一些您不知道的内部方法,请检查 FancyBboxPatch.draw 的源代码

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

正如我所看到的,FancyBboxPatch 是 Patch 的子类,它是 Artist 的子类,Patch 和 Artist 都有方法 draw,所以你不能简单地覆盖它们而不调用原始方法

编辑:我超级盲目,抱歉,您正在调用 draw 方法,但是将 *args 和 **kwargs 添加到任何覆盖的方法是一个好主意.. 尝试一下,也许调用 FancyBboxPatch.draw覆盖方法的结束

于 2013-02-27T14:21:21.093 回答
0

重写类方法实例方法时语法有所不同。它可能会帮助您解决问题。因此,对覆盖的“draw”方法的调用应该是:

super(Cell,self).draw(renderer)

您的构造函数也是如此:

super(Cell,self).__init__(xy, width, height, **kwargs)
于 2017-06-02T03:20:20.640 回答