Hallo JMP-Community;
In meinem Bestreben, einige der mühsameren Aufgaben der Annotation von Graph Builder-Plots zu automatisieren, versuche ich, mithilfe des folgenden Skripts dynamisch horizontale Liniensegmente zwischen Datengruppen hinzuzufügen. Leider sieht es so aus, als ob ich für diese spezielle Aufgabe nicht einfach Expr() gefolgt von Substitute() und Eval() verwenden kann. Hinweis: Ich arbeite mit sensiblen Daten und muss daher bei Bedarf Schein-DATA- und STAT-Tabellen erstellen.
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;
);Alle Ideen wären willkommen.
Danke
Ihre Lösung ist für diesen Fall großartig, da HLine und VLine unendlich lang sind. Hier finden Sie eine Erklärung und einige Alternativen.
Die Matrix mit eckigen Klammern ist eine Konstante zur Kompilierungszeit und kann keine Variablen verwenden. Ich habe oft Verkettungsoperatoren verwendet, um kleine Matrizen wie diese zu erstellen:
a = 17;
b = 23;
Show( a || b, a |/ b );
ein || b = [17 23];
a |/ b = [17, 23];
Sie können auch matrix() verwenden:
matrix( {{a, b}, {a, a}} );[17 23, 17 17]
Wenn Ihre Linie auf 0,2 und 1,8 begrenzt werden muss, können Sie eine andere Linienform verwenden, die Listen anstelle von Matrizen akzeptiert:
line( {x1,y1}, {x2,y2} )Die Zeilenfunktion wertet die Ausdrücke in jeder Liste aus.
Und wenn Sie eine unendlich lange Linie in einem anderen Winkel als horizontal oder vertikal benötigen, können Sie die YFunction() verwenden:
YFunctionYFunctionYFunktion