Aktualisieren Sie die Referenzlinie der Spaltenachse basierend auf Daten aus einer anderen DatentabelleIch möchte Spaltenreferenzlinien hinzufügen, die auf Daten aus einem anderen Datenbereich basieren. Ein Beispiel: Die Verwendung von „Große Klasse“ würde die Spalten „Gewicht“ und „Höhe“ mit P50- und P95-Werten aus einer Nachschlagedatentabelle aktualisieren.
Die Zeilen in der Nachschlagedatentabelle entsprechen den Spaltennamen in der Haupttabelle. Den Referenzzeilen müsste der Beschriftungswert aus dem Spaltennamen „P50“ oder „P95“ der Nachschlagetabelle zugewiesen werden, und der Wert stammt aus der Zeile in dieser Spalte.
Beispiel für die hinzugefügten Stützenachsen-Referenzlinien:

Beispiel für eine Lookup-Datentabelle:

Ich kenne mich mit JSL nicht besonders gut aus und freue mich daher über jede Hilfe, die mir zu diesem Thema in den Weg kommt. Ich habe ein Skript erstellt, aber es macht nicht das, was ich will.
Die Spalte scheint beschädigt zu sein. Beim Zeichnen einer Verteilung werden manchmal alle Werte „0“ angezeigt. Wenn ich außerdem versuche, sowohl P50- als auch P95-Referenzzeilen hinzuzufügen, wird nur die letzte in der Spalte gespeichert und sie wird in beiden Spalten gespeichert.
dt = Open ("C:\Program Files\SAS\JMP\15\Samples\Data\big class.jmp");
dtLookup = New Table( "Lookup Table",
Add Rows( 2 ),
New Column( "Column Name",
Character,
Nominal,
Set Values( {"weight", "height"} )
),
New Column( "P50",
"Continuous",
Set Values( [100, 61] )
),
New Column( "P95",
"Continuous",
Set Values( [120, 70] )
)
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
numRowsLookup = N Rows( dtLookup );
numColsLookup = N Cols( dtLookup );
for(n=1,n<=numRowsLookup,n++,
col_name = dtLookup[n,1];
If(contains(col_name_list,col_name),
for(j=2,j<=numColsLookup,j++,
col = Column(dt, col_name);
col_name_Lookup = col_name_list_lookup[j];
value = Column(dtLookup,col_name_Lookup)[n];
col <<
Set Property("Axis",
{
//Add Ref Line( 63, "Dashed", "Orange", "P50", 2 )
Add Ref Line( value, "Dashed", "Orange", col_name_Lookup, 2 )
});
);
);
);
Danke schön,
Roger
Automatisierung und SkripterstellungDatenmischung und -bereinigungMassenanpassungBetreff: Aktualisieren Sie die Referenzlinie der Spaltenachse basierend auf Daten aus einer anderen DatentabelleLetztes Update hier. Besonderer Dank geht an Jarmo.
Ich konnte es wie vorgesehen zum Laufen bringen. Endgültiger Code hier zum späteren Nachschlagen.
Names Default To Here(1);
namespace("here")<<REMOVE></REMOVE> New Column("P99", "Continuous", Set Values([125, 75]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Analysis Columns"n; //Ref column name
new_properties = {}; // re-init
old_properties = {}; // re-init
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//Add Multiple Ref Lines
For( i = 2, i <= N Items( col_name_list_lookup ), i++,
new_properties_temp =
EvalExpr({
Add Ref Line(Expr(as column(dtLookup,col_name_list_lookup[i])), "Dashed", Expr(Color To RGB( 67 )),Expr(char(col_name_list_lookup[i])), 1)
});
new_properties = Insert(new_properties, new_properties_temp);
);
//end Add Multiple
//Add Specified Reference Lines
//new_properties = EvalExpr({
// Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
// Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
//});
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
//show(prop_to_add); // for debug
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Applies the new axis settings.
);
);
Betreff: Aktualisieren Sie die Referenzlinie der Spaltenachse basierend auf Daten aus einer anderen DatentabelleHallo Jarmo,
Ich schätze die Hilfe hierzu. Leider habe ich hier nicht gesehen, dass die alten und neuen Achseneigenschaften aktualisiert wurden. Ich habe gesehen, dass der Liste „prop_to_add“ alte und neue Eigenschaften angehängt wurden, aber als ich die tatsächlichen Achseneinstellungen überprüfte, sah ich nur die beiden neuen Eigenschaften.
Nachdem die Klammern aus den eingestellten Eigenschaften entfernt wurden, funktionierte es wie erwartet!
Jetzt muss ich nur noch daran arbeiten, dass dies mit N Nachschlagespalten funktioniert.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
//stop();
For Each Row(dtLookup,
//stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
//stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
//stop();
//Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)}))); // Didn't work with the braces.
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Worked when removing the braces.
);
);Betreff: Aktualisieren Sie die Referenzlinie der Spaltenachse basierend auf Daten aus einer anderen DatentabelleSie könnten versuchen, den Code in Teilen zu debuggen. Sie können „For Each Row“ Zeile für Zeile „ausführen“, indem Sie Row() = rownumber anstelle der Schleife verwenden.
//For Each Row(dtLookup,
Row() = 1;
col_name =:"Column Name"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);
Und dann beginnen Sie mit der zeilenweisen Ausführung des Codes:
old_properties = Column(dt, col_name) << get property("Axis");
//Empty()
Einige Haltepunkte zum Debuggen (ich verwende den Debugger nicht, aber es wäre damit höchstwahrscheinlich noch einfacher):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
stop();
For Each Row(dtLookup,
stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
stop();
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)})));
);
);
Skriptindex für Einfügung:

Einige Links zur Unterstützung bei der Skripterstellung:
JSL-Syntaxreferenz
Skript-Anleitung
JMP 16-Hilfe
Betreff: Aktualisieren Sie die Referenzlinie der Spaltenachse basierend auf Daten aus einer anderen DatentabelleWas macht die Funktion Insert() hier? Es scheint mir nicht möglich zu sein, dass es funktioniert.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Column Names"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);Betreff: Aktualisieren Sie die Referenzlinie der Spaltenachse basierend auf Daten aus einer anderen DatentabelleIch bin mir nicht 100 % sicher, aber vielleicht könnten Sie zuerst die alten Axis-Eigenschaften mit << Get Propery("Axis") abrufen und diese dann hinzufügen.
Vielleicht so etwas (es könnte auch einfachere Möglichkeiten geben):
old_properties = Column(dt, "height") << get property("Axis");
old_with_new = Insert(old_properties, Expr(Add Ref Line(1, "Dashed", "Orange", "P45", 2)));
Eval(EvalExpr(column(dt, "height") << Set Property("Axis",{expr(old_with_new)})));Betreff: Aktualisieren Sie die Referenzlinie der Spaltenachse basierend auf Daten aus einer anderen DatentabelleDanke Jarmo. Diese Lösung ist viel einfacher, scheint jedoch alle vorhandenen Achsenreferenzlinien zu überschreiben. Wissen Sie, ob es eine Möglichkeit gibt, bereits in dieser Spalte vorhandene Achsenreferenzlinien beizubehalten?
Betreff: Aktualisieren Sie die Referenzlinie der Spaltenachse basierend auf Daten aus einer anderen DatentabelleHier ist ein Beispielskript. Ich vermute, dass die Achse überschrieben wird, wenn Sie es mehrmals auf diese Weise versuchen, sodass Sie sie möglicherweise in derselben << Set-Eigenschaft hinzufügen müssen (mehrere verschiedene Arten, den Ausdruck dafür zu erstellen).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
For Each Row(dtLookup,
col_name =:"Column Name"n;
//because we know we have only two lines to add and they are always added
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis", {
Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
}))
);
);

Nicht sicher, ob Eval(EvalExpr()) ist hier notwendig, schadet aber nicht.
Betreff: Aktualisierung der Spaltenachsen-Referenzlinie basierend auf Daten aus einer anderen DatentabelleDas JSL-Skript ist sehr hilfreich, um Daten direkt in Axis zu importieren. Wäre es möglich, die unten stehende Beschriftungseinstellung in das obige JSL-Skript einzufügen?
Ich versuche, Ihren Code mit zusätzlichen Einstellungen zu ergänzen/zu modifizieren, erhalte aber einen Fehler.
Für ( i = 2, i <= N Items( col_name_list_lookup ), i++,
neue_Eigenschaften_temp =
EvalExpr({
Add Ref Line(Expr(as column(dtLookup,col_name_list_lookup[i])), "Dashed", Expr(Color To RGB( 0 )),Expr(char(col_name_list_lookup[i])), 1,
Label Position( "Inside Inline" ), Opposite Axis( 1 ))
)
});
new_properties = Insert(new_properties, new_properties_temp);
);

Betreff: Aktualisierung der Spaltenachsen-Referenzlinie basierend auf Daten aus einer anderen DatentabelleStellen Sie sicher, dass alle Halterungen in der richtigen Position sind.
Mehr anzeigen...
For(i = 2, i <= N Items(col_name_list_lookup), i++,
new_properties_temp = Eval Expr(
{Add Ref Line(
Expr(As Column(dtLookup, col_name_list_lookup[i])),
"Dashed",
Expr(Color To RGB(0)),
Expr(Char(col_name_list_lookup[i])),
1,
Label Position("Inside Inline"),
Opposite Axis(1)
)}
);
new_properties = Insert(new_properties, new_properties_temp);
);