3

フィギュアに軸のセットを作成し、次の'ButtonDownFcn'ようにそのプロパティにコールバックを割り当てています。

HRaxes = axes('Parent', Figure, 'Position', [.05 .60 .9 .35],...
              'XLimMode', 'manual', 'ButtonDownFcn', @HR_ButtonDown);

コールバック関数がそのように定義されている場合:

function HR_ButtonDown(hObject, eventData)
  %# Do some stuff here when the axes is clicked on...
end

次のように軸に何かをプロットするまで、コールバックは正常に機能します。

plot(HRaxes, data.HR_X, data.HR_Y, 'b');

その後、軸をクリックしてもコールバックはトリガーされなくなります。何が問題になっていますか?どうすれば修正できますか?

4

2 に答える 2

2

@David Snyder、imageオブジェクトにもButtonDownFcnコールバックプロパティがあることに注意してください。次に、コールバックで、プロパティまたは関数axesを介して対応するプロパティにアクセスできます。たとえば、ButtonDownFcn コールバックで、クリックしたピクセルとボタンの位置を使用するとします。画像をプロットするときは、Parentancestor

imh = image(some_image);
set(imh,'ButtonDownFcn',@position_and_button);

コールバックを別の場所で定義した場所

function position_and_button(hObject,eventdata)
   Position = get( ancestor(hObject,'axes'), 'CurrentPoint' );
   Button = get( ancestor(hObject,'figure'), 'SelectionType' );
   %# do stuff with Position and Button
于 2012-03-14T00:44:41.613 に答える
2

ここでの主な問題は、関数PLOT高レベルのプロット関数であることです。つまり、プロットにオブジェクトを追加し、既存のプロット設定を変更します。'NextPlot'Axes オブジェクトのプロパティを見ると、高レベルのプロット関数が Axes オブジェクトにどのように影響するかを決定する 3 つの設定があることがわかります。

  • add— 既存の座標軸を使用してグラフィックス オブジェクトを描画します。

  • replace— デフォルト以外のすべての軸プロパティをリセットしPosition、グラフィックスを表示する前にすべての軸の子を削除します ( と同等cla reset)。

  • replacechildren— すべての子オブジェクトを削除しますが、軸のプロパティはリセットしません ( と同等cla)。

がデフォルト設定であるため、 PLOTを呼び出すと、コールバックに'replace'設定したハンドルは何もリセットされず、ボタンクリック動作がオフになります。これを回避するには、次の 2 つの方法があります。'ButtonDownFcn'

  • PLOT'NextPlot'を呼び出す前に、座標軸のプロパティを('add'既存のプロット オブジェクトに追加する) または'replacechildren'(既存のプロット オブジェクトを置き換えるが、現在の座標軸のプロパティ設定を維持する) に設定します。

    HRaxes = axes('Parent', Figure, 'Position', [.05 .60 .9 .35],...
                  'XLimMode', 'manual', 'ButtonDownFcn', @HR_ButtonDown,...
                  'NextPlot', 'add');
    plot(HRaxes, data.HR_X, data.HR_Y, 'b');
    
  • 既存のプロット プロパティを変更しない低レベルのプロット ルーチン ( LINEなど) の使用:

    HRaxes = axes('Parent', Figure, 'Position', [.05 .60 .9 .35],...
                  'XLimMode', 'manual', 'ButtonDownFcn', @HR_ButtonDown);
    line(data.HR_X, data.HR_Y, 'Parent', HRaxes, 'Color', 'b');
    
于 2011-03-11T15:51:47.087 に答える