18

matplotlibの図から「ホーム」、「戻る」、「進む」ボタンイベントを「取得」する方法を知っている人はいますか?

ボタンが押されたときにプロットが正しく動作するように、いくつかの関数を呼び出すイベントが必要です。つまり、デフォルトの動作では、必要なことを実行していません。

Matplotlib は、基礎となるデータセットが一定であり、x/y 軸の制限をリセットしてそれらのボタンを再プロットするだけでよいと想定しています。ボタンイベントがトリガーされます

4

3 に答える 3

25

Matplotlib は、「ホーム」、「戻る」、または「進む」ボタン イベントを提供しません。

「ホーム」、「戻る」、または「進む」ボタン イベントで呼び出されるコールバックを追加するための一般的な方法は、matplotlib バックエンドをサブクラス化することです。
しかし、私はこのアプローチに賛成ではありません。私はそれには2つの短所があると思います:

  1. 異なるバックエンドを使用したい場合は、それぞれをサブクラス化する必要があります。
  2. matplotlib の外部に独自のバックエンドを展開することは簡単ではありません。バックエンドは PYTHONPATH にあるモジュールでなければなりません。

matplotlib によって提供されるバックエンドはどれも、およびメソッドをオーバーライドしないためNavigationToolbar2です。私は、より簡潔なモンキー パッチを適用したアプローチを好みます。 たとえば、独自の方法でを置き換えることができます。homebackforward
NavigationToolbar2home

import matplotlib.pyplot as plt
from matplotlib.backend_bases import NavigationToolbar2

home = NavigationToolbar2.home

def new_home(self, *args, **kwargs):
    print 'new home'
    home(self, *args, **kwargs)

NavigationToolbar2.home = new_home

fig = plt.figure()
plt.text(0.35, 0.5, 'Hello world!', dict(size=30))
plt.show()

matplotlib のmpl_connectスタイルを模倣することもできます。

import matplotlib.pyplot as plt
from matplotlib.backend_bases import NavigationToolbar2, Event

home = NavigationToolbar2.home

def new_home(self, *args, **kwargs):
    s = 'home_event'
    event = Event(s, self)
    event.foo = 100
    self.canvas.callbacks.process(s, event)
    home(self, *args, **kwargs)

NavigationToolbar2.home = new_home

def handle_home(evt):
    print 'new home'
    print evt.foo

fig = plt.figure()
fig.canvas.mpl_connect('home_event', handle_home)
plt.text(0.35, 0.5, 'Hello world!', dict(size=30))
plt.show()
于 2013-02-27T10:06:06.903 に答える
7

この問題に対するバックエンドに依存しない解決策を知りません。しかし、Qt4Agg バックエンドを使用している場合は、これを試すことができます。

import matplotlib
matplotlib.use("Qt4Agg")
import pylab as p

def home_callback():
    print "home called"

def back_callback():
    print "back called"

def forward_callback():
    print "forward called"

p.ion()
p.plot(p.random((10)))

fm = p.get_current_fig_manager()

fm.toolbar.actions()[0].triggered.connect(home_callback)
fm.toolbar.actions()[1].triggered.connect(back_callback)
fm.toolbar.actions()[2].triggered.connect(forward_callback)

最初に、現在の Figure マネージャーを取得して、そのツールバーにアクセスできるようにします。次に、追加のコールバックをそのアクションに接続できます。

QT4Agg をバックエンドとして使用できない場合は、他のバックエンドでも同様のことを試みることができます。

于 2013-02-27T07:10:47.150 に答える
5

x 軸または y 軸のサイズが変更されるたびに何らかの関数を呼び出すだけで済む場合、最も簡単なハックは、軸によって生成されたイベントにバインドすることxlim_changedですylim_changed。例えば:

   def on_xlim_change(*args):
          print "do your pushing and popping here..."
   ax = gca()
   ax.callbacks.connect('xlim_changed',on_xlim_change)

このコールバックは、進む、戻る、またはホーム キーを押すたびに実行されるほか、パン ツールやズーム ツールを使用するときも実行されます (少なくとも WX および GTK バックエンドでは)。ただし、matplotlib が軸の通常の再スケーリングを既に行った後でも実行されます。

これらのボタン コールバックに直接アクセスしたい場合は、使用しているバックエンドによってイベント処理が異なるため、バックエンドに依存しない簡単な方法はわかりません。基本的なアプローチは、メソッドをサブクラス化matplotlib.backends.backend_<name>.NavigationToolbar2<name>してオーバーライドすることだと思います。使用している特定のバックエンドに応じて、新しいツールバー クラスを組み込む方法を正確に把握する必要があります。forwardbackhome

軸の制限の設定とはあまり関係のないカスタムの「前方/後方」コントロールを実装したい場合は、代わりにウィジェットを使用する方がよいでしょう。

于 2013-02-27T00:32:25.957 に答える