Utiliser la liste variable de colonnes comme axe Y dans Graph BuilderGens,
Je viens de passer de JMP14 Pro à JMP15 Pro et je rencontre des problèmes avec plusieurs de mes scripts JSL qui utilisent OverlayPlots.J'essaie de convertir certains de mes OP les plus complexes en GB et je rencontre un problème lors de l'utilisation de listes de variables en GB.Avec les OP, le code suivant a réussi à tracer toutes les variables d'un fichier de données donné qui répondaient aux critères Y( Eval List ( ???? ) ).J'ai créé ce code pour tenir compte du fait que différents sites de terrain peuvent avoir un nombre différent de capteurs présents que je souhaite tracer.
// 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 n'aime pas la même construction de liste que celle que j'ai utilisée avec les OP et renvoie l'erreur suivante :
Colonne spécifiée introuvable dans la table de données.{191471} lors de l'accès ou de l'évaluation de 'Y', Y( Eval List( act_tair_list ) ) /*###*/Exception lors du lancement de la plateforme{191471} lors de l'accès ou de l'évaluation de 'Graph Builder '
J'ai réalisé la plupart de mes graphiques JSL à l'aide de la plate-forme OP et je ne dispose pas des connaissances nécessaires pour résoudre ce problème.
Est-il possible de transmettre une liste de variables à GB pour l'axe Y, et si oui, à quoi ressemble ce format ? J'apprécierais toute aide pour résoudre ce problème afin de pouvoir continuer à utiliser un seul script graphique pour toutes les variables sur tous les sites de terrain, quels que soient les capteurs spécifiques réels présents.Merci.
Re : Utiliser une liste variable de colonnes comme axe Y dans Graph BuilderNames 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 )
)
);Re : Utiliser une liste variable de colonnes comme axe Y dans Graph BuilderL'idée est simple. Substitute() recherche une expression dans une expression, j'ai donc mis une expression inhabituelle, vvv, dans l'expression principale afin qu'elle soit la cible sans ambiguïté. La fonction le remplace par l'expression que j'ai construite pour les colonnes du rôle Y.
Je ne sais pas ce que tu veux dire par " appeler la liste de variables réelle à la fin de l'instruction GB. " Je ne fais rien de tel. Je suppose à quoi vous faites peut-être référence, je peux seulement dire que vous ne comprenez pas la différence entre le code en cours d'exécution et les expressions. De plus, les arguments nommés dans un appel de fonction ou dans l’envoi d’un message sont indépendants de leur position.
Il peut être instructif pour vous de sélectionner l'expression Eval() et d'exécuter ce code par lui-même. Il génère une nouvelle expression qui est évaluée.
Ce cas est une simple application des expressions of. Vous devriez étudier le Guide de script JMP ou assister à l'un de nos cours sur l'introduction des scripts.
Re : Utiliser une liste variable de colonnes comme axe Y dans Graph BuilderMarque,
L'autre chose à propos de votre solution est qu'elle trace chaque variable dans un panneau séparé plutôt que toutes sur le même panneau, ce qui est finalement ce que je veux.Le code ci-dessous illustre ce que je veux produire.J'ai essayé différentes modifications de votre code mais en vain.Pourriez-vous me faire une suggestion sur la façon dont je peux y parvenir ?Merci.
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} )}
)
)
);
Re : Utiliser une liste variable de colonnes comme axe Y dans Graph BuilderMerci Mark pour la suggestion très utile,
Pouvez-vous expliquer pourquoi vous devez utiliser ce qui ressemble à un espace réservé, vvv, au lieu d'appeler Name Expr ( var expr ) à cet emplacement ?Je vois qu'aucun graphique n'est produit lorsque je fais cela, mais je ne comprends pas pourquoi il est nécessaire de vvv et d'appeler la liste de variables réelle à la fin de l'instruction GB au lieu de l'endroit où les variables sont normalement déclarées.
Re : Utiliser une liste variable de colonnes comme axe Y dans Graph BuilderLe lancement de Graph Builder ne fonctionne pas de la même manière que le lancement d'Overlay Plot. Overlay Plot utilisait un argument nommé Y() qui acceptait une référence de colonne ou une liste de références de colonne. Graph Builder se lance avec un argument Y() distinct pour chaque colonne de ce rôle. Voici un exemple basé sur le tableau de données Fitness :
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 ) )
)
);
Une approche consiste à utiliser des expressions. Les fonctions Insert Into() et Substitute() facilitent la création de l'expression de lancement nécessaire.
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 )
)
);Re: Utiliser une liste variable de colonnes comme axe Y dans Graph BuilderMerci pour cette excellente explication. J'essaie d'enseigner le Substitute aux employés qui commencent à utiliser des scripts. J'ai remarqué que cet exemple est codé en dur pour les 3 graphiques de cette section ci-dessous. Si vous ajoutez une 4e colonne à la liste (comme col = {:Runtime, :RunPulse, :RstPulse, :MaxPulse}, cela ne trace toujours que 3 graphiques dans Graph Builder
Elements(
Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ),
Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 4 ) )
)
Existe-t-il un moyen simple de configurer également ces expressions dans la boucle For ? Je ne suis pas tout à fait certain si la nouvelle expression doit commencer par Elements(), ou si elle peut être réalisée en assemblant une expression Points() et une expression Smoother(), similaire à "var expr" ? Je vais jouer avec ça, mais je voulais savoir s'il existe une autre astuce concernant ce que Substitute pourrait voir comme une expression, ou à quel niveau de l'expression il est recommandé de commencer. Par exemple, vous avez démarré l'expression var avec "Variables (X (:Weight)) puis vous avez inséré les Y. Est-ce une bonne pratique ?