Salve comunità JMP;
Nella mia ricerca per automatizzare alcune delle attività più noiose dei grafici di annotazione di Graph Builder, sto cercando di aggiungere dinamicamente segmenti di linea orizzontale tra gruppi di dati utilizzando il seguente script. Sfortunatamente, sembra che non sia possibile utilizzare il semplice Expr () seguito da Substitute () e Eval () per questo compito specifico. Nota: sto lavorando con dati sensibili, quindi dovrò creare finte tabelle DATA e STAT se necessario.
Names Default to Here (1);
dt1 = Data Table ("DATA.JMP");
dt2 = Data Table ("STAT.JMP");
gbe = Expr (dt1 << Graph Builder(
Size( 699, 625 ),
Variables(
X( :R vs NR ),
Y( _YS_ ),
Color( :R vs NR )
),
Elements(
Points( X, Y, Legend( 6 ) ),
Box Plot( X, Y, Legend( 8 ), Outliers( 0 ) )
),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Add Graphics Script(
2,
Description( "Script" ),
Pen Size (3);
// The following line of code return the error "Invalid Matrix Token"
Line ([0.2,0.8], [Y1, Y1]);
Text( Center Justified, {0.5, top1}, VAL1 );
// The following line of code return the error "Invalid Matrix Token"
Line ([0.2,1.8], [Y2, Y2]);
Text( Center Justified, {1.0, top2}, VAL2 );
// The following line of code return the error "Invalid Matrix Token"
Line ([1.2,1.8], [Y1, Y1]);
Text( Center Justified, {1.5, top1}, VAL3 );
), Grid Line Order( 1 ), Reference Line Order( 3 )}
)
)
)
);
For (i = 749, i <= 750, i++,
YCOL = Column (dt1, i);
PVAL1 = "p VAL = " || CHAR(format(Column (dt2, 2) [i-747],"PValue"));
PVAL2 = "p VAL = " || CHAR(format(Column (dt2, 3) [i-747],"PValue"));
PVAL3 = "p VAL = " || CHAR(format(Column (dt2, 4) [i-747],"PValue"));
data_topy1 = Col Quantile (YCOL, 0.99);
data_topy2 = Col Quantile (YCOL, 0.975);
gbx = Substitute(Name Expr (gbe),
Expr (_YS_), YCOL,
Expr (VAL1), PVAL1,
Expr (VAL2), PVAL2,
Expr (VAL3), PVAL3,
Expr (Y1), data_topy1,
Expr (Y2), data_topy2
);
gb = Eval (gbx);
gb << journal;
gb << close window;
);Tutte le idee sarebbero benvenute.
Grazie
La tua soluzione è ottima per questo caso poiché HLine e VLine sono infinitamente lunghi. Ecco una spiegazione e alcune alternative.
La matrice della parentesi quadra è una costante in fase di compilazione e non può utilizzare variabili. Ho spesso usato operatori di concatenazione per costruire piccole matrici come questa:
a = 17;
b = 23;
Show( a || b, a |/ b );
un || b = [17 23];
a |/ b = [17, 23];
Puoi anche usare matrix():
matrix( {{a, b}, {a, a}} );[17 23, 17 17]
Se la tua linea doveva essere delimitata a 0,2 e 1,8, potresti usare una diversa forma di linea che accetta liste piuttosto che matrici:
line( {x1,y1}, {x2,y2} )La funzione di linea valuta le espressioni in ogni elenco.
E, se hai bisogno di una linea infinitamente lunga con un angolo diverso da orizzontale o verticale, puoi usare YFunction():
YFunctionYFunctionFunzione Y