JSL: 列をループし、グラフ ビルダー レポートを生成し、それぞれを JPG ファイルとして保存する方法こんにちは、
41 個の変数を含むデータセットがあります。 たとえば、40 個の箱ひげ図またはジッター プロットを作成するには、最初の 40 個をそれぞれ最後のものに対してプロットする必要があります。
[グラフの作成] メニューを使用して、十分な機能を備えた優れたプロットを作成するのは簡単で、さらに楽しいことです。 自分が実行したスクリプトを保存する方法は知っていますが、反復ごとに別の変数を取得し、それを元のグラフ コードに置き換えるループを作成する方法がわかりません。 言い換えれば、コードが 20 行ある場合、同じコードを何度も実行し、従属変数を定義する場所のみを変更するループが必要になります。 さらに、結果を表示する適切な方法が必要なので (40 ウィンドウは現実的ではありません)、次の反復に進む前にそれぞれを JPG として保存することを考えました。 これはJMPで可能でしょうか?
ありがとう !
Re: JSL ループ次の例は、列名のリストを文字列として取得する方法を示しています。For ループは、リストの 2 番目の列から始まる非表示のグラフ ビルダーを生成します。これは、最初の列が X として使用されるためです。(元の投稿では、リストの最初の列から開始し、リストの最後の列の手前で停止するようにこれらを調整する必要があります。) 各グラフ ビルダー レポートは、ファイル名に列名が含まれる JPG ファイルとして保存されます。最後に、データ テーブルと非表示のレポートが閉じられます。
/* Open a sample data table */
dt = Open( "$SAMPLE_DATA\Fitness.jmp" );
/* Obtain a list of numeric/continuous column names as strings */
colList = dt << Get Column Names( Continuous, String );
/* Loop through the list to generate the desired Graph Builder
and save the report as a JPEG file */
For( i = 2, i <= Nitems( colList ), i++,
gb = dt << Graph Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables(
X( :Age ),
Y( Column( dt, colList[i] ) ),
Color( :Age )
),
Elements(
Points(
X,
Y,
Legend( 3 ),
Summary Statistic( "Mean" ),
Error Bars( "Confidence Interval" )
)
),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Marker Size( 5 )}
)
),
Invisible
);
gb << Save Picture( "E:\Trash\Graph Builder_" || colList[i] ||".jpg", JPEG );
);
/* Close table and all invisible reports */
Close( dt, No Save );
お役に立てば幸いです!
JSLループこんにちは、
助けようとしてくれてありがとう。 残念ながら、私はまだ JSL に十分慣れていないので (仕事が休みになったら、もっと深く勉強するつもりです)、括弧などで問題が発生したため、あなたの提案は機能しませんでした。間違った場所に標識が1つありました。
私の元のコードは次のとおりです。
Graph Builder(
Size( 880, 750 ),
Show Control Panel( 0 ),
Variables(
X( :Cutoff, Size( 0, 21 ) ),
Y( :S1, Size( 0, 22 ) ),
Color( :Cutoff )
),
Elements(
Points( X, Y, Color, Legend( 1 ), Jitter( 1 ) ),
Line(
X,
Y,
Color,
Legend( 2 ),
Row order( 0 ),
Error Bars( "Confidence Interval" ),
Summary Statistic( "Mean" )
)
),
SendToReport( Dispatch( {}, "Graph Builder", FrameBox, {Marker Size( 5 )} ) )
);
ループで包むのを手伝ってもらえますか?
乾杯!
JSLループこんにちは!やりたいことはとても簡単です。
まず、スクリプトで現在のデータ テーブルを定義します。
cd = Current Data Table();
次に、列名のリストを取得します。
column_names = cd << Get Column Names;
次の部分を実行するには複数の方法がありますが、これが最も簡単だと思います。最終的に解析して評価するテキスト文字列を開始する必要があります。最初の部分は、新しいウィンドウを作成することです。
nw = "New Window(\"Graphs\",
randomname = V List Box(";
これで、わずかな変更を 1 つ加えてカスタム コードを挿入するループを作成できます。JMP の「for」ループの使用方法を知っていると仮定します。テーブルの最後の列を除くすべての列を反復処理するだけです。
for(i=1,i<=length(column_names)-1,i++,
nw = nw || "PUT YOUR CUSTOM CODE HERE*" || ",";
);
*カスタム コードで従属変数を定義している場合は、従属変数を削除して次のように置き換えます。
:Name(\"" || column_name || "\")
これにより、作成したカスタム スクリプト内にある各従属変数のテキスト名が貼り付けられます。
最後に、先ほど開始した新しいウィンドウを終了する必要があります。最初の行は新しいウィンドウを作成するコードの記述を終了し、2 行目は最初にテキストを解析してコードを作成し、次に nw に含まれるコードを評価します。
nw = nw || "));";
eval(parse(nw));
これで十分です。ご質問がある場合、または具体的なサポートが必要な場合は、お知らせください。