0

compoundFancyBboxPatch 内にカプセル化されたテキストと画像を含む形状を描画できるアーティストを matplotlib で作成したいと考えています。前述の FancyBboxPatch からクラスを派生させ、「描画」メソッドをオーバーライドしましたが、機能していないようです。

私が達成しようとしているのは、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この方法でメソッドをオーバーライドできますか?

ティア

4

2 に答える 2

0

クラス メソッドインスタンス メソッドをオーバーライドする場合、構文に違いがあります。問題の解決に役立つ場合があります。したがって、オーバーライドされた「描画」メソッドの呼び出しは次のようになります。

super(Cell,self).draw(renderer)

同じことがあなたのコンストラクターにも当てはまります:

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

これを試して:

  • 最初に、*args をinitパラメータに追加して、それを FancyBboxPatch にも渡すようにしてください。初期化
  • 描画をオーバーライドするときは、元の描画を呼び出す必要があります。変更が完了した後 (または前) に、認識していない内部メソッドが呼び出される可能性があるため、FancyBboxPatch.draw のソース コードを確認してください。

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

ご覧のとおり、FancyBboxPatch は、Artist のサブクラスである Patch のサブクラスです。Patch と Artist の両方に draw メソッドがあるため、元のメソッドを呼び出さずに単純にオーバーライドすることはできません。

編集: 私は非常に盲目です。申し訳ありませんが、draw メソッドを呼び出していますが、オーバーライドされたメソッドに *args と **kwargs を追加することをお勧めします..それを試して、おそらく FancyBboxPatch.draw を呼び出してくださいオーバーライドされたメソッドの終わり

于 2013-02-27T14:21:21.093 に答える