在图形生成器中使用变量列列表作为 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 个图表进行硬编码的。如果您将第 4 列添加到列表中(例如 col = {:Runtime, :RunPulse, :RstPulse, :MaxPulse},仍然只会在 Graph Builder 中绘制 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。这是最佳实践吗?