在圖形生成器中使用變量列列表作為 Y 軸各位,
我剛剛從 JMP14 Pro 升級到 JMP15 Pro,並且我的許多使用 OverlayPlots 的 JSL 腳本都遇到了問題。我試圖將一些更複雜的操作轉移到 GB,但在 GB 中使用變量列表時遇到了問題。使用 OP,以下代碼成功繪製了滿足 Y( Eval List (??????) ) 標準的給定數據文件的所有變量。我創建此代碼是為了適應這樣一個事實:不同的現場站點可能有不同數量的傳感器,我想要繪製這些傳感器。
// Potential Tair Data
pot_tair_list = {"Datalogger Internal Temperature (C)", "Air Temperature - HMP - 5m (C)", "Air Temperature - HMP (C)",
"Air Temperature, STD - HMP (C)", "Air Temperature - WXT (C)", "Air Temperature @ 5m - HMP (C)", "Air Temperature - MA4100 (C)",
"Air Temperature - EE181 (C)", "Air Temperature - WS700 (C)", "Air Temperature - GMX541 (C)"};
// Create empty list to hold names of the those measurement variables found in data table
act_tair_list = {};
// Run through data table column names and put those that match measurement variable list into new list
For( i = 1, i <= N Items( pot_tair_list ), i++,
If( Contains( dt_col_name_list, pot_tair_list[i] ),
Insert Into( act_tair_list, pot_tair_list[i] )
)
);
******************************
// Plot Air Temperature data
If( N Items( act_tair_list ) > 0,
Graph Builder(
Size( 1600, 500 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Legend Position( "Right" ),
Fit to Window( "Off" ),
Graph Spacing( 3 ),
Variables( X( :Name( "Date & Time" ) ), Y( Eval List( act_tair_list ) ) ),
Elements( Line( X, Y, Legend( 4 ) ), Points( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
"Date & Time",
ScaleBox,
{Format( "m/d/y", 10 ), Min( sdate ), Max( edate ), Interval( "Day" ), Inc( 28 ), Minor Ticks( 0 )}
),
Dispatch(
{},
Y( Eval List( act_tair_list ) ),
ScaleBox,
{Format( "Fixed Dec", 10, 0 ), Inc ( 5 ), Show Major Grid( 1 ), Minor Ticks( 0 )}
),
Dispatch(
{},
"400",
ScaleBox,
{Legend Model( 1, Properties( 0, {Line Color( 3 ), Fill Color( 0 )}, Item ID( "Battery (V)", 1 ) ) )}
),
Dispatch( {}, "Graph Builder", FrameBox, {Marker Size( 1 )} )
)
)
);
GB 不喜歡我在 OP 中使用的相同列表結構,並拋出以下錯誤:
在數據表中找不到指定的列。{191471} 在訪問或評估“Y”時,Y( Eval List( act_tair_list ) ) /*###*/平台啟動時出現異常{191471} 在訪問或評估“Graph Builder”時'
我已經使用 OP 平台完成了大部分 JSL 繪圖,但缺乏如何解決此問題的知識。
是否可以將 Y 軸的變量列表傳遞給 GB,如果可以,該格式是什麼樣的? 我將不勝感激解決此問題的任何幫助,以便我可以繼續對所有現場站點的所有變量使用單個圖形腳本,而不管實際存在的特定傳感器如何。謝謝。
回复:在圖形生成器中使用變量列列表作為 Y 軸Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
col = { :Runtime, :RunPulse, :RstPulse };
var expr = Expr( Variables( X( :Weight ) ) );
For( c = 1, c <= N Items( col ), c++,
y expr = Expr( Y( Position( 1 ) ) );
Insert Into( y expr, col[c], 1 );
Insert Into( var expr, Name Expr( y expr) );
);
Eval(
Substitute(
Expr(
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
vvv,
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
),
Expr( vvv ),
Name Expr( var expr )
)
);回复:在圖形生成器中使用變量列列表作為 Y 軸這個想法很簡單。 Substitute() 在表達式中查找表達式,因此我在主表達式中放置了一個不尋常的表達式 vvv,以便它成為明確的目標。 該函數將其替換為我為 Y 角色中的列構建的表達式。
我不知道你說的“在 GB 指令的末尾調用實際變量列表。 ” 我不會做這樣的事情。 我猜你可能指的是什麼,我只能說你對正在執行的代碼和表達式之間的區別感到困惑。 此外,函數調用或消息發送中的命名參數與位置無關。
選擇 Eval() 表達式並單獨運行此代碼可能會對您有所幫助。 它生成一個新的表達式並進行計算。
本例是表達式的簡單應用。 您應該學習《JMP 腳本編寫指南》或參加我們的一門有關介紹腳本編寫的課程。
回复:在圖形生成器中使用變量列列表作為 Y 軸標記,
關於您的解決方案的另一件事是,它將每個變量繪製在單獨的面板中,而不是全部繪製在同一面板上,這最終是我想要的。下面的代碼說明了我想要生成的內容。我已經嘗試對您的代碼進行不同的更改,但沒有成功。您介意提供有關我如何實現這一目標的建議嗎?謝謝。
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
Graph Builder(
Fit to Window( "Off" ),
Graph Spacing( 3 ),
Variables(
X( :Weight ),
Y( :Runtime ),
Y( :RunPulse, Position( 1 ) ),
Y( :RstPulse, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Line( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 6 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base( 0, 0, 0, Item ID( "Runtime", 1 ) ),
Base( 1, 0, 0, Item ID( "RunPulse", 1 ) ),
Base( 2, 0, 0, Item ID( "RstPulse", 1 ) )
)}
),
Dispatch(
{},
"400",
LegendBox,
{Legend Position( {3, [-1, -1, -1], 6, [0, 1, 2]} ),
Position( {-1, -1, -1, 0, 1, 2} )}
)
)
);
回复:在圖形生成器中使用變量列列表作為 Y 軸感謝馬克非常有幫助的建議,
您能解釋一下為什麼需要使用看起來像佔位符的 vvv,而不是在此位置調用 Name Expr ( var expr ) 嗎?我發現執行此操作時沒有生成任何圖表,但我不清楚為什麼需要 vvv 並在 GB 指令末尾調用實際變量列表,而不是通常聲明變量的位置。
回复:在圖形生成器中使用變量列列表作為 Y 軸圖形生成器的啟動方式與啟動疊加圖的方式不同。 疊加圖使用一個命名參數 Y(),它接受列引用或列引用列表。 圖形生成器啟動時,為該角色中的每一列提供一個單獨的 Y() 參數。 以下是基於健身數據表的示例:
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables(
X( :Weight ),
Y( :Runtime ),
Y( :RunPulse, Position( 1 ) ),
Y( :RstPulse, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
一種方法是使用表達式。 Insert Into() 和 Substitute() 函數可以輕鬆創建必要的啟動表達式。
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
col = { :Runtime, :RunPulse, :RstPulse };
var expr = Expr( Variables( X( :Weight ) ) );
For( c = 1, c <= N Items( col ), c++,
y expr = Expr( Y() );
Insert Into( y expr, col[c] );
Insert Into( var expr, Name Expr( y expr) );
);
Eval(
Substitute(
Expr(
gb = dt << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
vvv,
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
);
),
Expr( vvv ),
Name Expr( var expr )
)
);回覆:在圖形產生器中使用變數列清單作為 Y 軸感謝您的精彩解說。我正在嘗試向開始使用腳本的員工教授替補。我注意到這個範例是針對下面本節中的 3 個圖表進行硬編碼的。如果將第四列加入清單(例如 col = {:Runtime, :RunPulse, :RstPulse, :MaxPulse},仍只在圖形產生器中繪製 3 個圖形
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
有沒有簡單的方法可以在 For 迴圈中設定這些表達式?我不太確定新表達式是否應該以 Elements() 開頭,或者可以透過組裝 Points() 表達式和 Smoother() 表達式來完成,類似於“var expr”?我會嘗試這個,但想知道是否還有其他一些關於 Substitute 可能將其視為表達式的技巧,或者建議從表達式的哪個層級開始。例如,您以「Variables (X (:Weight)) 開始 var expr,然後插入 Y。這是最佳實踐嗎?