公開日: 11/25/2021

Mousetrap()

Mousetrap()は、マウスをクリックしたときの座標から、グラフ用の引数を取得します。最初のスクリプトは、マウスボタンを押すたびに実行され、2番目のスクリプトはマウスボタンを放すたびに実行され、ハンドルの新しい座標に従って、グラフを動的に更新します。Handleと同様に、Mousetrapの座標に初期値を設定することが重要になります。グラフにMousetrap()Handle()の両方を含める場合は、Handle()Mousetrap()の前に配置します。そうすれば、Handle()の方がMousetrap()より先にクリックを捉えることができます。

次の例では、Mousetrap()Handle()の両方を使って、Mousetrap()の座標によって変化する3次元の関数を定めます。Handle()の値に基づいて、等高線を1本描きます。

x0 = 0;
y0 = 0;
z0 = 0;
win = New Window( "3次元関数の等高線",
	Graph Box(
		Frame Size( 300, 300 ),
		X Scale( -5, 5 ),
		Y Scale( -5, 5 ),
		Contour Function(
			Exp( -(x - x0) ^ 2 ) * Exp( -(y - y0) ^ 2 ) * (x - x0),
			x,
			y,
			z0 / 10
		);
 

// zの丸め値をハンドルから取得

		Handle( -4.5, z0, z0 = Round( y * 10 ) / 10 );
				V Line( -4.5 );
		Text Size( 9 );
		Text(
			Counterclockwise,
			{-4.6, -4},
			"ドラッグして等高線のz値を設定: z = " || Char( z0 / 10 )
		);
		Marker Size( 2 );
		Marker( 2, {x0, y0} );
		Mousetrap( // 基準点をクリックポイントに設定
			x0 = x;
			y0 = y;
		);
		Text(
			{-4.25, -4.9},
			"任意の位置をクリックして関数の中心点を設定。"
		);
	)
);

メモ: Mousetrap()の式でx0xに、y0yに設定する代わりに、Function( {xx, yy}, Show( xx, yy ); x0 = xx; y0 = yy );を使うことができます。xxyyは、この関数の引数であり、ユーザがグラフをクリックしたときにMousetrapによってそれらの引数の値が設定されます。Function( {xx, yy}...)ではxxyy名前を明示的に指定しており、xyに限らず任意の名前を付けられます。

図12.27 Mousetrap()とHandle() 

Mousetrap() and Handle()

グラフ上で点を視覚的に補間したりするために、Mousetrap()を使ってデータテーブルに点を収集することもできます。次に、(「二変量の関係」の散布図のような)プロット上でマウスをクリックし、その点をデータテーブルに追加するスクリプトの例を示します。スクリプトを実行してグラフ内をクリックすると、クリックした点がデータテーブルに記録されます。

dt = New Table( "データ1" );
New Column( "xx", Numeric );
New Column( "yy", Numeric );
x = 0;
y = 0;
Add Point = Expr(
	dt << Add Rows( 1 );
	Row() = N Row();
	:xx = x;
	:yy = y;
);
win = New Window( "点の追加",
	Graph Box(
		Frame Size( 500, 300 ),
		X Scale( -5, 5 ),
		Y Scale( -5, 5 ),
		For Each Row( Marker( {xx, yy} ) );
		Mousetrap( {}, Add Point );
	)
);

この例では、MouseTrapの最初のスクリプトの引数が空であることに注意してください。マウスボタンを押しても、何も起こりません。第2引数のスクリプトadd pointは、マウスボタンを放したときに実行され、データ点が追加されます。クリックしてドラッグし、マウスボタンを放した場合、データセットに追加される点は、マウスボタンを押した位置の点ではなく、マウスを移動した後の位置の点です。

より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).