JSLでは、行の属性の関数を使って行の属性を操作することができます。
データテーブルには、さまざまな属性を格納する「行の属性」という特殊なデータ要素があります。行の属性は、次のような属性を格納します。
• 行が選択されているか、除外されているか、非表示になっているか、ラベルがついているか
• マーカーの種類、色、色合い、グラフ上での色相
行の属性に応じて、JMPによる処理の内容が変わってきます。Table 9.5で各属性について説明します。複数の行の属性を組み合わせて使用することができます。
行の属性 |
結果への影響 |
---|---|
除外する |
行が除外されている場合、JMPはそれらの行を統計分析(テキストレポートとチャート)の計算から除く。結果は、データが入力されていないときと同じになります。ただし、その行はプロット内に点として表示されます。(プロットから点を除くには「表示しない」を設定します。すべての結果から行を除外するには、「除外する」と「表示しない」の両方を指定します。) |
表示しない |
行が「表示しない」になっている場合、JMPはそれらの行をプロットに表示しない。ただし、行はまだテキストレポートおよびチャート内に含まれています。(レポートおよびチャートから行を除くには「除外する」を指定します。すべての結果から行を除外するには、「除外する」と「表示しない」の両方を指定します。) |
ラベルのついた行 |
行にラベルがついている場合、JMPは、散布図内の点に、行番号のラベルまたは指定されたラベル列の値を配置する。 |
色 |
行に色が指定されている場合、JMPはそれらの色を使って、散布図内の点をわかりやすく表示する。 |
マーカー |
行にマーカーが指定されている場合、JMPはそれらのマーカーを使って、散布図と回転プロット内の点をわかりやすく表示する。 |
選択 |
行が選択されている場合、JMPはプロットおよびチャート内の対応する点や棒を強調表示する。 |
メモ: 行の属性メッセージの場合は、引数を省略すると、オプションがトグルします。つまり、オプションがオフの場合は、メッセージによってオプションがオンになり、オプションがオンの場合は、メッセージによってオプションがオフになります。また、"toggle"、"switch"、"flip"の各引数をr << Exclude( "toggle" )のように使用することもできます。
行の属性の関数に引数として数値(または数値を導き出す式)を指定すると、関数はその数値を可能な値へのインデックスと解釈します。
Table 9.6は、行の属性関数を比較した表です。この表を見ると、行の属性から数値に、または数値から行の属性に変換する関数がわかります。表には、各関数で使用できる数値も含まれています。
数値 |
数値から行の属性への変換
|
行の属性 |
行の属性から数値への変換
|
数値 |
---|---|---|---|---|
1または0 |
Excluded State(n) |
除外する |
Excluded(rowstate) |
1または0 |
1または0 |
Hidden State(n) |
表示しない |
Hidden(rowstate) |
1または0 |
1または0 |
Labeled State(n) |
ラベルのついた行 |
Labeled(rowstate) |
1または0 |
1または0 |
Selected State(n) |
選択 |
Selected(rowstate) |
1または0 |
0 ~ 31 |
Marker State(n) |
マーカー |
Marker Of(rowstate) |
0 ~ 31 |
0 ~ 84 (0-15は基本色、16-31は暗い、32-47は明るい、48-63は非常に暗い、64-79は非常に明るい、80-84は灰色) |
Color State(n) |
色 |
Color Of(rowstate) |
0 ~ 84 (0-15は基本色、16-31は暗い、32-47は明るい、48-63は非常に暗い、64-79は非常に明るい、80-84は灰色) |
0 ~ 11 (虹の色の順) |
Hue State(n) |
色相 |
|
|
-2 ~ 2 (暗い~明るい) |
Shade State(n) |
色合い |
|
|
JSLを使って行の属性を割り当てるには、Select Whereを使って対象となる行を指定してから、それらの行に割り当てる属性を指定します。次の例は、性別が「F」の行にマーカーの種類「5」を割り当てます。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Select Where( :性別 == "F" ) << Markers( 5 );
計算式を使って行の属性を割り当てることもできます。それをデータテーブルで行う方法を紹介します。
1. 行の属性列を作成します。
2. 列に、性別が「F」である行にマーカーを割り当てる計算式を追加します。
3. 「列」パネルで、行の属性列の隣にある星を右クリックし、[行の属性へコピー]を選択します。
この手順をJSLで表現すると、次のようになります。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "行の属性",
Row State,
Set Formula( If( :性別 == "F", Marker State( 4 ) ) )
);
Column( "行の属性" ) << Copy To Row States();
行の属性の列は、行の属性を情報として格納するだけで、属性を実際に有効にするわけではありません。行の属性の列を有効にするには、続いてFor Each Rowを使用します。行の属性の列については、『JMPの使用法』の「行の属性」列への情報の保存を参照してください。
次の例は、行の属性の列を作成し、それらの属性を有効にします。
1. 次のスクリプトを実行、新しいデータテーブルの作成を開始します。
dt = New Table( "行の属性テスト" );
2. 次のスクリプトを実行して列に行の属性を追加し、10行を追加します。
dt << New Column( "行の属性データ", Row State, Set Formula( Color State( Row() ) ) );
dt << Add Rows( 10 );
3. 次のスクリプトを実行し、行の属性を有効にします。
For Each Row( Row State() = :行の属性データ );
図9.17 行の属性のないテーブル(左)と行の属性のあるテーブル(右)
このスクリプトは、現在有効な行の属性を、行の属性の列に設定された組み合わせで置き換えます。他の属性を変更したり取り消したりしないで、行の属性のうち選択したものだけを変える方法については、1つの特性だけを設定し、他の特性をキャンセルするを参照してください。
Row State関数を使うと、JSLから直接、行の属性を設定または取得できます。行nの属性は、Row State(n)で設定または取得できます。引数を指定しなければ、現在の行を設定または取得します。すべての行を処理するには、For Each Rowループを使うか、計算式列で処理します。
行の属性を設定するには、行の属性に式を割り当て、式の左辺(L-value)に置きます。
Row State( 1 ) = Color State( 3 ); // 行1を赤にする
Row() = 8; Row State() = Color State( 3 ); // 8番目の行を赤にする
For Each Row( Row State() = Color State( 3 ) ); // すべての行を赤にする
データテーブルを指定するには、第1引数としてデータテーブル参照を含めます。
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = Open( "$SAMPLE_DATA/San Francisco Crime.jmp" );
Row State( dt1, 1 ) = Color State( 3 ); // 行1を赤にする;
行の属性を取得するには、行の属性式を割り当て式の右辺に置きます。
x = Row State( 5 ); // 行5の行の属性をxに保存する
x = Row State(); // 現在の行の行の属性
Row State() のすべての属性を設定するのか、Color Of(Row State() ) のように特定の1つの属性だけを設定するのかという点に注意してください。動作を確かめるには、まず、すべての行に色とマーカーの属性を設定します。
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
For Each Row(
Row State() = Combine States( Color State( Row() ), Marker State( Row() ) ) );
ここで、行の属性のうち1つの属性だけを変更してみましょう。
Color Of( Row State( 1 ) ) = 3; // マーカーを変更しないで行1を赤にする
行の属性のすべての要素をクリアして1つの属性を設定するには、次のようにします。
Row State( 1 ) = Color State( 5 ); // 行1を青にし、そのマーカーを削除する
現在の行の属性をすべて行属性列にコピーするには、次のようにします。
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
For Each Row(
dt1,
Row State() = Combine States(
Color State( Row() ),
Marker State( Row() )
)
);
dt1 << New Column( "rscol", "Row State", Set Formula( Row State() ) );
現在の行の属性をすべてではなく一部(複数)だけ行属性列にコピーするには、次のようなスクリプトを使います(必要のない属性は、コメントにするか削除してください)。
New Column( "rscol2",
Set Formula(
Combine States(
Color State( Color Of() ),
Excluded State( Excluded() ),
Hidden State( Hidden() ),
Labeled State( Labeled() ),
Marker State( Marker Of() ),
Selected State( Selected() )
)
)
);
行の属性のうち1つの特性を設定するには:
Color Of( Row State( i ) ) = 3; // 行iの色を赤に変更
Selected( Row State( i ) ) = 1; // 行iの選択の属性を1に設定
上の例のように、関数の中には、数値を属性に変換するものと、属性を数値に変換するものがあります。このどちらであるかを判別するためのヒントを示します。
数値を属性に変換する関数には、「State」という語が含まれています。
数値引数をとり、属性を戻すかまたは属性割り当てを受け取る関数はすべて、次のように、名前に「State」という語が含まれています。
Row State、As Row State、Color State、Combine States、Excluded State、Hidden State、Hue State、Labeled State、Marker State、Selected State、Shade State。
属性を数値に変換する関数は、1語か、または「Of」という語が含まれています。
行の属性を引数にとる(引数が与えられていない場合は、Row State()を引数とみなす)関数と、数値を戻すか数値に設定されている関数は、次のように、1語であるか、または2番目の語が「Of」です。Color Of、Excluded、Hidden、Labeled、Marker Of、Selected。
Table 9.6は、これらの関数の違いを説明した便利な表です。
次のコマンドは、インタラクティブなコマンドと同じものです。
Copy From Row States
Add From Row States
Copy To Row States
Add To Row States
たとえば、行の属性を含むデータテーブルを作成してみましょう。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "行の属性データ", Row State, Set Formula( Color State( Row() ) ) );
dt << Add Rows( 10 );
For Each Row( Row State() = :行の属性データ );
行の属性を取得するには、次のようなスクリプトを実行します。
Row State( 1 ); // 行1の行の属性を戻す
Row() = 8; Row State(); // 現在の行(8番目の行)の行の属性を戻す
For Each Row( Print( Row State()) ); // 各行の行の属性を戻す
行の属性を取得し、グローバル変数に格納するには、割り当て式の右辺にRow State()を置きます。次の行を上記のスクリプトに追加します。
::x = Row State( 1 ); // 1行目の行の属性をグローバル変数xに保存する
Row() = 8; ::x = Row State(); // 8行目の行の属性をxに保存する
Show( x ); // x = Color State( 8 )を戻す
dt << New Column( "rscol", Row State) ;
// 行の属性を、「rscol」(行の属性の列)に保存する
For Each Row( :rscol = Row State() );
行の属性のうち1つの特性だけを取得するには、行の属性式を割り当て式の右辺に置き、左辺に指定できる演算子のどれかを使います。
x = Selected( Row State() ); // 現在の行が選択されているかどうかのインデックス
Combine States()の中で属性の設定を組み合わせることで、多数の属性を一度に取得または設定できます。また、属性が組み合わされた後も、各属性ごとに取得または設定することが可能です。次の例は、男子に緑のYマーカーを設定し、プロットではそれらを非表示にします。また、女子にはXマーカーを設定し、それらをプロットに表示します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
For Each Row(
If( 性別 == "M",
/* then */ Row State() = Combine States(
Color State( 4 ), Marker State( 6 ), Hidden State( 1 ) ),
/* else */ Row State() = Combine States(
Color State( 3 ), Marker State( 2 ), Hidden State( 0 ) ) ) );
1つの行、たとえば6行目の行の属性を取得します。
Row State( 6 );
Combine States(Hidden State(1), Color State(4), Marker State(6))
JMPは、Combine State()で属性の組み合わせを戻すことに注意してください。これは、行の属性データは、色などの1つの属性だけではなく、除外、非表示、ラベル付け、選択、マーカー、色、色相、濃淡など、設定されたすべての属性をまとめたものだからです。このような特性のリストは、行の属性の組み合わせと呼ばれます。
複数の行の属性が有効になっている場合もあるので、行の属性列は複数の特性を値として持つことができるようになっています。
行の属性のすべてを取得または設定するための全体的なRow State()関数の他に、一度に1つの特性を優先的に取得または設定する関数があります。つまり、1つの行に1つの特性だけを与えるため、他の特性をすべて取り消します。1つの特性を設定し、その他をキャンセルする関数は、Color State、Combine States、Excluded State、Hidden State、Hue State、Labeled State、Marker State、Selected State、
Shade Stateです。
たとえば、行4を表示しないという属性だけを設定するには、次のようにします。
Row State( 4 ) = Hidden State( 1 );
行の属性とは、1つの特性ではなく多数の特性が組み合わされたものです。一度に1つだけ処理するには、Row Stateと左辺に指定できる演算子のどれかを、取得か設定かによって等号のどちらかの側で使います。左辺に指定できる演算子として、Color Of、Excluded、Hidden、Labeled、Marker Of、Selectedがあります。
この例は、他の特性には影響を与えずに、行4を非表示にします。
Hidden( Row State( 4 ) ) = 1
この例は、他の特性には影響を与えずに、行3の色を格納します。
::color = Color Of( Row State( 3 ) );
データテーブルオブジェクトにMake Row State Handlerメッセージを送信すると、行の属性が変更されたときにコールバックを取得します。以下はその例です。
f = Function( {X}, Show( x ) );
obj = dt << Make Row State Handler( f );
これで、棒グラフなどで行をグループ選択すると、行の属性が変更されている行の番号がログに送られます。例:
x:[3, 4, 28, 40, 41]
複数行が強調表示されている場合は、選択がクリアされた行に対して1回、新しく選択された行に対して1回の計2回、ハンドラが呼び出されることがあります。
この節では、オンまたはオフのブール値をとる状態について説明します。このような状態としては、行の除外、非表示、ラベル、選択があります。
• Excludedは、除外されているかどうか示す除外インデックスを取得または設定します。インデックスの値が1なら真、0なら偽です。
• Hiddenは、非表示は1、表示は0の非表示インデックスを取得または設定します。
• Labeledは、ラベルがついているなら1、ついていないなら0のラベルインデックスを取得または設定します。
• Selectedは、選択されている場合は1、選択されていない場合は0の選択インデックスを取得または設定します。
次の例は、これらの状態を示します。
Excluded( Row State() ); // 現在の行が除外されている場合は1、除外されていない場合は0を戻す
Hidden(); // 現在の行が表示されない場合は1、表示される場合は0を戻す
Labeled( Row State() ); // 現在の行にラベルがついている場合は1、ラベルがついていない場合は0を戻す
Selected(); // 現在の行が選択されている場合は1、選択されていない場合は0を戻す
Excluded( Row State() ) = 1; // 現在の行を除外する
Hidden() = 0; // 現在の行を表示する
Labeled( Row State() ) = 1; // 現在の行にラベルをつける
Selected() = 0; // 現在の行の選択を取り消す
これらの関数では、引数が指定されていない場合は、Row State()が引数であるとみなされます。
Excluded State、Hidden State、Labeled State、Selected Stateは、逆に、引数に基づいて、行の属性の状態を真または偽として取得または設定します。ゼロ以外の値は行の属性を真に、ゼロの値は偽に設定します。欠測値の場合は、行の属性に変更はありません。
Row State() = Excluded State( 1 ); // 現在の行の属性を「除外されている」に変更する
Row State() = Hidden State( 0 ); // 現在の行の属性を「再表示」に変更する
Row State() = Labeled State( 1 ); // 現在の行の属性を「ラベルがついている」に変更する
Row State() = Selected State( 0 );
// 現在の行の属性を「選択されていない」に変更する
上記の最初の2つの式は、行の属性のうち除外または表示を置き換えるだけで、他の既存の行属性の特性は失われません。通常、設定したいすべての特性のstateコマンドをCombine Statesの中に記述します。次の例は、3番目の行を非表示にし、緑の正方形のマーカーに変更します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Row State( 3 ) = Combine States(
Color State( 4 ),
Marker State( 3 ),
Hidden State( 1 ) );
また、行の属性に(累積特性として)追加できる値を持つ行の属性データ列内で -Stateコマンドを使うのも一般的な方法です。次の例は、各奇数行を除外します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "myExcl",
Row State,
Set Formula( Excluded State( Modulo( Row(), 2 ) ) )
);
For Each Row( Row State() = Combine States( :myExcl, Row State() ) );
Clear Row States()は、データテーブルから行の属性を削除します。次のスクリプトは、行の属性を各行に割り当てた後、その行の属性を削除します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
For Each Row( Row State() = Color State( Row() ) );
Wait( 3 ); // 結果がわかりやすいように一時停止する
dt << Clear Row States();
選択した行から行の属性をクリアするには、まず行を選択してから、選択した行の属性をクリアします。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
For Each Row( Row State() = Color State( Row() ) );
dt << Select Rows( [ 5 ] );
Wait( 3 ); // 結果がわかりやすいように一時停止する
dt << Clear Selected Row States();
この節では、多数の選択肢がある状態について説明します。このような状態には、色、マーカー、色相、色合いがあります。
Color Of()は、色番号を戻すか、設定します。色番号とは、row stateに対応するJMPカラーマップの色番号で、色が割り当てられていない場合は0となります。
Color Of( Row State() ); // 現在の行の色番号を戻す
Color Of() = 4; // 現在の行を色4に設定する
同様に、Marker Ofは、マーカー番号を戻すか、設定します。マーカー番号は、アクティブなマーカーに対応するJMPマーカーマップのマーカー番号で、マーカーが割り当てられていない場合は0となります。
Marker Of(); // 現在の行のマーカー番号を戻す
Marker Of( Row State() ) = 4; // 現在の行をマーカー4に設定する
Color Of()とMarker Of()はどちらも、すべての行の属性の式もしくは列、またはRow State()を引数として受け取り、引数が指定されていない場合は、引数Row State()を引数とみなします。
Color State()とMarker State()は、逆方向に動作することを除くと、Color Of()およびMarker Of()と同じです。-Of関数は、実際の属性をインデックスに変え、-State関数は、インデックスを属性に変えます。
Row State() = Color State( 4 ); // 現在の行を緑に変更する
Row State() = Marker State( 4 ); // 現在の行をひし形のマーカーに変更する
最後の2つのコマンドは、行の属性のうち色またはマーカーを置き換えるだけで、他の既存の特性は失われません。通常、設定したいすべての特性の-StateコマンドをCombine States()の中に記述します。次の例は、3番目の行に緑の正方形のマーカーを配置し、その行を非表示にします。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Row State( 3 ) = Combine States(
Color State( 4 ),
Marker State( 3 ),
Hidden State( 1 ) );
次のスクリプトは、JMPの標準的なマーカー(0~31)を表示します。0~31の範囲外にあるインデックスの動作は定義されていません。
New Window( "マーカー",
Graph Box(
FrameSize( 300, 300 ),
Y Scale( 1, 16 ),
X Scale( 0, 7 ),
For(
i = 0;
jj = 15;,
i < 16;
jj >= 0;,
i++;
jj--;, // 16行、2列
Marker Size( 3 );
Marker( i, {1, jj + .2} ); // マーカー0~15
Marker( i + 16, {4, jj + .2} ); // マーカー16~31
Text( {1.5, jj}, "marker ", i ); // マーカーラベル0~15
Text( {4.5, jj}, "marker ", i + 16 ); // マーカーラベル16~31
)
)
);
図9.18 JMPマーカー
ヒント: このスクリプトについて詳しくは、表示ツリーを参照してください。
色については、以下の点に留意してください。
• JMPカラーには0~84の番号が付いています。
• 最初の16個は基本色です。下のスクリプトを参照してください。
• 17以降は、それぞれの基本色の色合いを暗め、または明るめにしたものです。
• 0~84の範囲外にあるインデックスの動作は定義されていません。
• JMPカラーの使用方法については、グラフで色を指定するを参照してください。
次のスクリプトは、JMPの標準の色を表示します。
Text Color( 0 );
New Window( "色",
Graph Box(
FrameSize( 640, 400 ),
Y Scale( -1, 17 ),
X Scale( -3, 12 ),
k = 0;
For( jj = 1, jj <= 12, jj += 2,
l = 15;
For( i = 0, i <= 15 & k < 85, i++,
thiscolor = Color To RGB( k );
Fill Color( k );
thisfill = 1;
If( thiscolor == {1, 1, 1},
Pen Color( 0 );
thisfill = 0;
,
Pen Color( k )
);
Rect( jj, l + .5, jj + .5, l, thisfill );
Text( {jj - 1, l}, "色", k );
k++;
l--;
);
);
jj = -2;
color = {"黒", "グレー", "白", "赤", "緑", "青", "オレンジ", "青緑",
"紫", "黄色", "シアン", "マゼンタ", "黄緑", "ブルーシアン", "赤紫", "黒"};
For(
i = 0;
l = 15;, i <= 15 & l >= 0,
i++;
l--;,
Text( {jj, l}, color[i + 1] )
);
) );
図9.19 JMPカラー
RGB値を使うには、赤、緑、青の順でそれぞれの含有率をリストして、各色を指定する必要があります。たとえば、次のように指定すると、緑がかった青になります。
Pen Color( {.38,.84,.67} ); // 小鴨色
色を選ぶ際、Color Stateを使う代わりにHue StateとShade Stateを一緒に使うこともできます。Hue Stateを使った場合は、黒、白、またはグレーの色合いは選べません。このような場合は、Shade Stateを単独で使うか、Color Stateを使う必要があります。
次のスクリプトは、色相および色合いの値と色との関係を表示します。
New Window( "色相と色合い",
Graph Box(
FrameSize( 600, 300 ),
Y Scale( -3, 3 ),
X Scale( -2, 12 ),
k = 0;
For( h = 0, h < 12, h++,
For( s = -2, s < 3, s++,
myMk = Combine States( Hue State( h ), Shade State( s ), Marker State( 15 ) );
Marker Size( 3 );
Marker( myMk, {h, s} );
)
);
Text( Center Justified, {5, 2.5}, " <--- 色相 0-11 ---> " );
Text( 右揃え,
{-.5, -2}, "色合い -2", {-.5, -2.25}, "(とても濃い)",
{-.5, -1}, "色合い -1", {-.5, -1.25}, "(濃い)",
{-.5, 0}, "色合い 0", {-.5, -.25}, "(基本の色相)",
{-.5, 1}, "色合い 1", {-.5, .75}, "(淡い)",
{-.5, 2}, "色合い 2", {-.5, 1.75}, "(とても淡い)"
);
)
);
図9.20 色相と色合い
HueとShadeには、-Of関数はありません。Color Ofは、Hue StateとShade State、またはそのどちらかで設定された色の行属性について、Color Stateと同じ番号を戻します。たとえば、行4と行5に同じ濃赤色のマーカーを設定します。
Row State( 4 ) = Combine States( Hue State( 0 ), Shade State( -1 ), Marker State( 12 ) );
Row State( 5 ) = Combine States(
Color State( Color Of( Row State( 4 ) ) ),
Marker State( Marker Of( Row State( 4 ) ) )
);
次の例では、行の属性の値は事前に準備され、座標の情報とともにMarkerルーチンに渡されます。
dt = New Table( "CPおよびCAデータの例",
Add Rows( 26 ),
New Column( "cover_cp",
Numeric,
"Continuous",
Formula( Random Uniform() / 100 + 0.94 )
),
New Column( "cover_ca",
Numeric,
"Continuous",
Formula( Random Uniform() * 0.04 + 0.94 )
),
New Column( "p", Numeric, "Continuous", Formula( Random Uniform() ) )
);
dt << Run Formulas;
greenMark = Combine States( Marker State( 2 ), Color State( 4 ) );
redDiamond = Combine States( Marker State( 3 ), Color State( 3 ) );
New Window( "CPおよびCA比較",
Graph Box(
Title( "CPおよびCA比較" ),
FrameSize( 400, 350 ),
X Scale( 0, 1 ),
Y Scale( 0.94, 1 ),
For Each Row(
Marker( greenMark, {p, cover_cp} );
Marker( redDiamond, {p, cover_ca} );
)
)
);
図9.21 行の属性の値と行列の例