Verwenden Sie eine variable Spaltenliste als Y-Achse im Graph BuilderLeute,
Ich habe gerade ein Upgrade von JMP14 Pro auf JMP15 Pro durchgeführt und habe Probleme mit vielen meiner JSL-Skripte, die OverlayPlots verwenden.Ich versuche, einige meiner komplexeren OPs auf GB umzustellen, und habe Probleme, wenn ich Variablenlisten in GB verwende.Mit OPs zeichnete der folgende Code erfolgreich alle Variablen für eine bestimmte Datendatei auf, die die Kriterien Y( Eval List ( ???? ) ) erfüllten.Ich habe diesen Code erstellt, um der Tatsache Rechnung zu tragen, dass an verschiedenen Feldstandorten möglicherweise eine unterschiedliche Anzahl von Sensoren vorhanden ist, die ich darstellen möchte.
// 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 mag den gleichen Listenaufbau, den ich mit OPs verwendet habe, nicht und gibt den folgenden Fehler aus:
Die angegebene Spalte wurde in der Datentabelle nicht gefunden.{191471} beim Zugriff oder bei der Auswertung von „Y“, Y( Eval List( act_tair_list) ) /*###*/Ausnahme beim Plattformstart{191471} beim Zugriff oder bei der Auswertung von „Graph Builder“. '
Ich habe die meisten meiner JSL-Grafiken mit der OP-Plattform erstellt und mir fehlen die Kenntnisse, wie ich dieses Problem lösen kann.
Ist es möglich, eine Variablenliste für die Y-Achse an GB zu übergeben, und wenn ja, wie sieht dieses Format aus? Ich würde mich über jede Hilfe bei der Lösung dieses Problems freuen, damit ich weiterhin ein einziges Grafikskript für alle Variablen an allen Feldstandorten verwenden kann, unabhängig von den tatsächlich vorhandenen spezifischen Sensoren.Danke.
Betreff: Variable Spaltenliste als Y-Achse im Graph Builder verwendenNames 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 )
)
);Betreff: Variable Spaltenliste als Y-Achse im Graph Builder verwendenDie Idee ist einfach. Substitute() sucht nach einem Ausdruck innerhalb eines Ausdrucks, also habe ich einen ungewöhnlichen Ausdruck, vvv, in den Hauptausdruck eingefügt, damit er das eindeutige Ziel ist. Die Funktion ersetzt ihn durch den Ausdruck, den ich für die Spalten in der Y-Rolle erstellt habe.
Ich weiß nicht, was du mit „ Aufruf der eigentlichen Variablenliste am Ende der GB-Anweisung. " Ich mache so etwas nicht. Ich vermute, worauf Sie sich beziehen. Ich kann nur sagen, dass Sie über den Unterschied zwischen ausgeführtem Code und Ausdrücken verwirrt sind. Außerdem sind benannte Argumente in einem Funktionsaufruf oder Nachrichtenversand positionsunabhängig.
Es könnte für Sie hilfreich sein, den Eval()-Ausdruck auszuwählen und diesen Code alleine auszuführen. Es generiert einen neuen Ausdruck, der ausgewertet wird.
In diesem Fall handelt es sich um eine einfache Anwendung von Ausdrücken. Sie sollten den JMP Scripting Guide lesen oder einen unserer Kurse zur Einführung in die Skripterstellung besuchen.
Betreff: Variable Spaltenliste als Y-Achse im Graph Builder verwendenMarkieren,
Das andere an Ihrer Lösung ist, dass sie jede Variable in einem separaten Panel darstellt und nicht alle auf demselben Panel, was letztendlich das ist, was ich möchte.Der folgende Code veranschaulicht, was ich produzieren möchte.Ich habe verschiedene Änderungen an Ihrem Code versucht, aber ohne Erfolg.Würde es Ihnen etwas ausmachen, einen Vorschlag zu machen, wie ich das erreichen kann?Danke.
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} )}
)
)
);
Betreff: Variable Spaltenliste als Y-Achse im Graph Builder verwendenDanke Mark für den sehr hilfreichen Vorschlag,
Können Sie erklären, warum Sie an dieser Stelle etwas verwenden müssen, das wie ein Platzhalter aussieht, vvv, anstatt stattdessen Name Expr ( var expr ) aufzurufen?Ich sehe, dass dabei kein Diagramm erstellt wird, aber mir ist nicht klar, warum vvv erforderlich ist und die eigentliche Variablenliste am Ende der GB-Anweisung aufgerufen werden muss, anstatt dort, wo die Variablen normalerweise deklariert werden.
Betreff: Variable Spaltenliste als Y-Achse im Graph Builder verwendenDer Start von Graph Builder funktioniert nicht auf die gleiche Weise wie der Start von Overlay Plot. Overlay Plot verwendete ein benanntes Argument Y(), das eine Spaltenreferenz oder eine Liste von Spaltenreferenzen akzeptierte. Graph Builder wird mit einem separaten Y()-Argument für jede Spalte in dieser Rolle gestartet. Hier ist ein Beispiel basierend auf der Fitness-Datentabelle:
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 ) )
)
);
Ein Ansatz besteht darin, Ausdrücke zu verwenden. Die Funktionen „Insert Into()“ und „Substitute()“ erleichtern das Erstellen des erforderlichen Startausdrucks.
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 )
)
);Betreff: Verwenden Sie eine variable Spaltenliste als Y-Achse im Graph BuilderVielen Dank für die tolle Erklärung. Ich versuche, Mitarbeitern, die gerade mit der Verwendung von Skripten beginnen, den Ersatz beizubringen. Mir ist aufgefallen, dass dieses Beispiel für die 3 Diagramme in diesem Abschnitt unten fest codiert ist. Wenn Sie der Liste eine vierte Spalte hinzufügen (wie col = {:Runtime, :RunPulse, :RstPulse, :MaxPulse}), werden im Graph Builder trotzdem nur 3 Diagramme gezeichnet.
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
Gibt es eine einfache Möglichkeit, diese Ausdrücke auch in der For-Schleife einzurichten? Ich bin nicht ganz sicher, ob der neue Ausdruck mit Elements() beginnen soll oder ob dies durch die Zusammenstellung eines Points()-Ausdrucks und eines Smoother()-Ausdrucks erfolgen kann, ähnlich wie bei „var expr“? Ich werde damit herumspielen, wollte aber wissen, ob es einen anderen Trick gibt, was Substitute als Ausdruck betrachten könnte, oder auf welcher Ebene des Ausdrucks man beginnen sollte. Sie haben beispielsweise den var expr mit „Variables (X (:Weight))“ begonnen und dann die Y-Werte eingefügt. Ist das eine bewährte Vorgehensweise?