你好,
我發現為圖形生成器編寫腳本是一種殘酷的經歷(我編寫 JMP 腳本已經有一段時間了)。 它似乎不直觀,我似乎找不到我需要的具體幫助。 所以我揮舞著我的白旗並向小組詢問。
我的腳本會取得正確的列(數量有所不同)並正確建立一個具有兩個嵌套 X 層級的圖形產生器。 問題是,雖然我給出的第一個變數是正確的點,但由於某種原因,圖形產生器將箱形圖分配給每個其他變數(在我的腳本中看不到)。 因此,我正在尋找一種簡單的方法將所有 y 變數轉換為點。 我懷疑它涉及循環遍歷 Elements,但如果我能找到正確的方法,我就該死了。
想法? 另外,有人對圖形產生器的詳細腳本有很好的參考嗎?
蒂亞! 弗雷德
是的。 我同意。 這也是我學習它的方法,但相對於其他腳本來說,它令人驚訝地令人沮喪。 一個進行更多討論的成熟領域!
謝謝您的幫忙。 我採取了以下方法(通過迭代......很多失敗!):
1. 我有一個要放入圖表中的列名稱清單。 它位於清單“a”(未顯示)中。 這就是我想要繪製的。
2. 我根據與我的搜尋清單相符的資料表列建立一個清單。 這些是我可以繪製的存在的 Y 軸變數。
3. 我建立了一個圖形產生器,並使用巢狀變數來設定 X 軸。 這對於我的所有數據來說都很常見。
4. 然後循環並加入變數。
5. 然後我循環並添加元素。
6. 然後我循環並添加網格線。 最後是標題。
對於步驟 4-6,如果我嘗試在單一循環中執行這些操作,JMP 就會不斷崩潰。 我就是這樣走到這一步的。 該腳本可以工作(必須提取一些小的機密內容),但速度不快。
與我寫的其他 JSL 相比,這相當笨拙。 我從來沒有遇到過這麼多 JMP 崩潰的情況。 但它有效。
dtname = dt << Get Name();
currentTime = Today();
timeString = "Last Updated " || Format( currentTime, "mm-dd-yyyy" ) ;
// Find columns that match the terms in list "a"
col = dt << get column names( string );
nc = N Items( col );
nsrch = N Items( a );
xxx = {};
For( j = 1, j <= nsrch, j++,
For( i = 1, i <= nc, i++,
If( Uppercase( col[i] ) == Uppercase( a[j] ),
Insert Into( xxx, col[i] ),
)
)
);
colList = xxx;
//Build Basic Chart with nested X variables, no Y variables (yet)
gb = dt << Graph Builder(
Size( 1226, 608 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Subtitle( 1 ),
Variables(
X( :XVar1, Combine( "Nested" ) ),
X( :XVar2, Position( 1 ), Combine( "Nested" ) ),
X( :XVar3, Position( 1 ), Combine( "Nested" ) ),
),
);
gbb = Report( gb )[Graph Builder Box( 1 )];
// I don't know why I have to break these into separate loops, but I tried not to....
// I think it's something to do with needing the "wait".
//Add Y variables.
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Variable( {colList[i], Role( "Y" )} );
If( i == 1,
chrtname = colList[i],
chrtname = chrtname || ", " || colList[i]
);
);
Wait( 1 );
//Remove existing element and replace with points.
For( i = 1, i <= N Items( colList ), i++,
gbb << Remove Element( 1, i, 1 );
gbb << Add Element( 1, i, {Type( "Points" ), X, Y} );
);
Wait( 1 );
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Element( 1, i, {Type( "Line" ), X, Y} )
);
//Set Major Axes
For( i = 1, i <= N Items( colList ), i++,
gbb << Dispatch( {}, colList[i], ScaleBox, {Label Row( Show Major Grid( 1 ) )} ),
);
//Set Various Titles
gb << SendToReport( Dispatch( {}, "graph 1 title", TextEditBox, {Set Text( timeString )} ) );
gb << SendToReport( Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( chrtname || " from " || dtname ), Image Export Display( Normal )} ) );
gb << SendToReport(
Dispatch(
{},
"XVar1",
ScaleBox,
{Label Row( 2, {Major Grid Line Color( 3 ), Show Major Grid( 1 )} ), Label Row( 3, {Major Grid Line Color( 5 ), Show Major Grid( 1 )} )}
)
);
);Graph Builder JSL 腳本不容易理解。我的方法是根據自己的喜好調整圖表,然後點擊紅色三角形並取得生成的腳本。
但是,如果您有動態數量的 Y 變量,您可以獲得 2 或 3 個 Y 變量的腳本,並研究 GB 腳本的模式。然後將其擴展到n Y 變量,您將動態建立一個包含要執行的 gb 腳本的字串,然後使用 eval(parse(gb_string)) 運行它。
這是使用表達式的一種方法。 在這種情況下我喜歡這種方法,因為我可以完全控制並且可以一次完成整個啟動表達式。
Names Default to Here( 1 );
// open example data
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// a list of columns to plot in Y role was previously created somehow
col = List( :height, :weight );
nc = N Items( col );
// create expression for Variables launch argument with first column,
// using same two nested X variables
vars arg = Eval Expr(
Variables(
X( :age ),
X( :sex, Position( 1 ) ),
Y( Expr( col[1] ) )
)
);
// create expression for Points launch argument with first column
points arg = Eval Expr(
Points( X( 1 ), X( 2 ), Y( 1 ) )
);
// add remaining columns in the Y role
If( nc > 1,
For( c = 2, c <= nc, c++,
Insert Into( vars arg, Eval Expr( Y( Expr( col[c] ), Position( 1 ) ) ) );
Insert Into( points arg, Eval Expr( Y( Expr( c ) ) ) );
);
);
// finish GB launch expression
gb expr = Substitute(
Expr(
Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
vvv,
Elements( ppp )
)
),
Expr( vvv ), Name Expr( vars arg ),
Expr( ppp ), Name Expr( points arg )
);
Eval( gb expr );
我意識到這個答案並不是一個完整的解決方案。 您沒有提供足夠的資訊來嘗試解決方案。 另外,您最好學習如何自己解決它。 它旨在說明一種可能適合您的方法。
您是否以 Y 角色繪製多列或使用多個圖形生成器物件(每一列一個)?
好吧,找到了一些解決辦法,但它肯定不穩定。
我結束了:
- 使用我想要的嵌套 x 變數製作初始圖,但沒有 Y 變數。
- 然後我運行一個循環來添加 Y 變數。
- 然後,我新增另一個循環來刪除每個 Y 的元素,並為每個有點的 Y 添加一個新元素。
- 然後我添加另一個循環來為每個 Y 添加網格線。
幾乎每個步驟之間都有一個 Wait(1)。 我最初嘗試為每個變數使用循環來完成每件事,到目前為止,我在某個地方使 JMP Complete 崩潰了大約 10 次。 正是我的故障排除讓我看到了上面的表格。
所以,它可以工作,但我肯定不喜歡如果編碼不正確,JMP 就會崩潰。 我仍然希望有人為我提供有關圖形生成器腳本的可靠參考。 先致謝!弗雷德