在“擬合組”中將“雙變量”替換為“圖形產生器”大家好!
很久以來,我一直有一個腳本,用於在擬合組中繪製雙變量圖,如下所示:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Bivariate( Y(Eval(Y_Parameters) ), X( :age ) ),
<<{Arrange in Rows( 3 )}
);
這裡的關鍵是 - 我以字串列表的形式取得參數列表,然後逐一繪製它們。
現在我需要從雙變量圖切換到圖形產生器,因為圖形生成器具有某些功能而雙變量圖沒有。
我找到了讓“圖形生成器”的圖看起來和“二元”圖一模一樣的方法,但我不知道是否有像上面那樣簡單的方法在“擬合組”中繪製邊界框。 「擬合組」似乎可以像這樣繪製邊界框:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[1]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[2]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
但是對於任意參數列表,我需要在循環中編寫腳本。我希望使用更簡單的方法,例如(顯然行不通):
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
),
<<{Arrange in Rows( 3 )}
)
GB 有沒有什麼方法可以取得參數清單並輸出 DisplayBox 清單?
自動化和腳本回覆:在“擬合組”中用“圖形產生器”替換“雙變量”你已經非常接近了。你確實需要用循環腳本來寫。下面這個方法似乎可行。你可以用 GUI 輸出替換列列表,或者如果你不熟悉 GUI 腳本,甚至可以編寫一些腳本來“獲取選定的列”,選擇要繪製的列,然後以編程方式將其轉換為列表。
圖形生成器的優勢在於互動性。這使得它不太適合在一個視窗上顯示多個圖表,因為每個圖表都需要修改(假設確實需要修改),但腳本可以讓它變得簡單(差不多)。
我有一個方法是使用一個腳本,它可以輸出到多個平台,包括 y by x 和 GB。但它也產生了列切換器。然後有一個按鈕可以將列切換器列表中的每個輸出繪製到日誌中。當然,那裡沒有互動性。
無論如何,這是稍微修改過的腳本
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
nw = new window("output",
vlb = vlistbox()
);
Y_Parameters = {"height", "weight"} //, "height 2", "weight 2"}; // test for n > 2
nColsNw = 3;
for(i = 1, i<= nitems(Y_Parameters), i++,
if(modulo(i - 1, nColsNw) == 0,
vlb << append(hlb = hlistbox()); //create a new hlb every N columns.
);
hlb << append(
Fit Group(
Graph Builder(
Size( 480, 300 ),
Show Control Panel( 0 ),
Variables( X( :age ), Y(Eval(Y_Parameters[i]) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ) )
)//,
// <<{Arrange in Rows( 3 )}
);
);
);
回覆:在“擬合組”中用“圖形產生器”替換“雙變量”對於圖形產生器,你實際上可以使用頁面來實現類似的效果,但這當然需要你的資料採用特定的格式。或者列切換器。
如果您無法使用頁面,我建議您放棄“擬合組”,轉而使用“圖表產生器”。將圖表收集到「行列框」中,以便輕鬆地按行分組。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(Y_Parameters))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
如果您希望更改每行的報告數量,可以使用 Lineup Box
<< N Col(1);
如果需要,您可以將腳本新增至最高層級的大綱方塊。
如果你想使用 Fit Group,你也可以這麼做,但這需要一些表達式處理。如果你經常需要這樣做,也可以建立一個函數來幫你完成。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
ycols = {"height", "weight"};
fg_expr = Expr(Fit Group());
gb_expr = Expr(dt << Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(_ycol_)),
Elements(Points(X, Y(1), Y(2), Legend(3)))
));
For Each({ycol}, ycols,
cur_gb_expr = Substitute(Name Expr(gb_expr),
Expr(_ycol_), Name Expr(AsColumn(dt, ycol))
);
Insert Into(fg_expr, Name Expr(cur_gb_expr))
);
fg = Eval(fg_expr);
fg << Arrange in Rows(2);
回覆:在“擬合組”中用“圖形產生器”替換“雙變量”我所面臨的限制如下:
此腳本是插件的一部分。目前,它以文字字串(透過 GUI 產生)中的列列表作為輸入。
我不需要互動性,我需要的是與客戶商定的精確的情節格式。
我換用GB了,因為「以X擬合Y」似乎不太方便顯示誤差線。客戶突然想在圖表上加誤差線。
問題在於如何最有效地產生 GB 列表,而不是單一 GB。我希望有一個尚未記錄的功能,可以像“Fit Group”和“Fit Y by X”那樣實現這一點。
但看起來我必須編寫循環腳本。
回覆:在“擬合組”中用“圖形產生器”替換“雙變量”我想我得換用 Line Up Box 了。我本來不想這麼做,因為它需要更複雜的程式碼修改,但我真的不喜歡腳本表達式。我只希望:
1. 我沒有在程式碼中的其他任何地方使用這個 Fit Group 的特定功能
2. 我將能夠使它在輸出中看起來與 Fit Group 完全一樣。
不過,我將展示最終輸出的範例程式碼。
回覆:在“擬合組”中用“圖形產生器”替換“雙變量”一旦我這樣做,你的腳本就會停止工作:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
gb = Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
);
lub << Append(
Insert Into(gbs, gb)
);
);
ob_group << Append(lub);
show(gbs);
從語意上來說,直接使用 Graph Builder 表達式和用變數來表示應該沒什麼區別——這是我的理解。為什麼這會破壞腳本?
回覆:在“擬合組”中用“圖形產生器”替換“雙變量”問你一個問題。
修復一個明顯的拼字錯誤後,您的腳本運行正常:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
nw = New Window("Graph Builder - " || (dt << get name),
ob_group = Outline Box("Fit Group")
);
lub = Lineup Box(N Col(3));
gbs = {};
For Each({yparam}, Y_Parameters,
lub << Append(
Insert Into(gbs, Graph Builder(
Size(480, 300),
Show Control Panel(0),
Variables(X(:age), Y(Eval(yparam))),
Elements(Points(X, Y(1), Y(2), Legend(3)))
))
);
);
ob_group << Append(lub);
show(gbs);
For 'gbs' it shows
{Graph Builder[], Graph Builder[]}
然後就可以完美地附加到「lub」了。
我以稍微不同的形式重寫了您建議的第一個腳本:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
Insert Into( listOfGBs, gbF( dt, X_Parameter, Y_Parameter, "sex" ) )
);
lub << Append( listOfGBs );
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group = Outline Box( "Fit Group" ) );
在我的例子中,「listOfGBs」也顯示為:
{Graph Builder[], Graph Builder[]}
但隨後在線上:
lub << Append( listOfGBs );
它會產生錯誤:
Not a display in access or evaluation of 'Append' , Append( listOfGBs ) /*###*/
at line 25 in ....
知道為什麼嗎?
我會嘗試嘗試一下,但我想讓 GB 保持功能。
回覆:在“擬合組”中用“圖形產生器”替換“雙變量”好的,它以這種形式工作:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
groupByColumnString = "sex";
gbF = Function( {dt, X_parameter, Y_Parameters, groupByColumnString},
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
Return( lub );
);
gbExpr = Expr(
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
groupByColumn = Column( dt, groupByColumnString );
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(
Insert Into(
listOfGBs,
Graph Builder(
Size( 480, 300 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables(
X( Column( X_Parameter ) ),
Y( Column( Y_Parameter ) ),
Overlay( groupByColumn )
),
)
)
)
);
);
//gbExpr;
lub = gbF(dt, X_parameter, Y_Parameters, groupByColumnString);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
Show( Type( ob_group ) );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group );
我既可以使用功能(我的方式),也可以使用表達(實際上是你的方式);
我不知道之前的問題是什麼,但顯然我需要在函數內部創建 LineUp Box 並返回它而不是 GB 物件。
回覆:在“擬合組”中用“圖形產生器”替換“雙變量”您正在為陣容框添加列表,而不是圖表構建器。我會將您的腳本修改為類似以下內容:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function( {dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column( dt, groupByColumnString );
gb = Graph Builder(
Size( 350, 200 ),
Ignore Platform Preferences( 1 ),
Show Control Panel( 0 ),
Variables( X( Column( X_Parameter ) ), Y( Column( Y_Parameter ) ), Overlay( groupByColumn ) ),
);
Return( gb );
);
lub = Lineup Box( N Col( 3 ) );
listOfGBs = {};
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(Insert Into(listOfGBs, gbF(dt, X_Parameter, Y_Parameter, "sex" )));
);
ob_group = Outline Box( "Fit Group" );
ob_group << Append( lub );
nw = New Window( "Graph Builder - " || (dt << get name), ob_group);
建立圖表時需要稍微小心一些。如果您開始嘗試使用表達式,通常可以避免這種情況,但這需要您自行建立。此外,如果您不需要收集引用,那麼建立圖表會稍微容易一些,因為您不需要「插入」。您可以稍後使用 << XPath 取得它們。
看更多...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Y_Parameters = {"height", "weight"};
X_Parameter = "age";
gbF = Function({dt, X_parameter, Y_Parameter, groupByColumnString},
groupByColumn = Column(dt, groupByColumnString);
gb = Graph Builder(
Size(350, 200),
Ignore Platform Preferences(1),
Show Control Panel(0),
Variables(X(Column(X_Parameter)), Y(Column(Y_Parameter)), Overlay(groupByColumn)),
);
Return(gb);
);
lub = Lineup Box(N Col(3));
For Each( {Y_Parameter, index}, Y_Parameters,
lub << Append(gbF(dt, X_Parameter, Y_Parameter, "sex" ));
);
ob_group = Outline Box("Fit Group");
ob_group << Append(lub);
nw = New Window("Graph Builder - " || (dt << get name), ob_group);
gbs = (ob_group << XPath("//OutlineBox[@helpKey='Graph Builder']")) << Get Scriptable Object;