Ciao,
Trovo che lo scripting per il Graph Builder sia un'esperienza brutale (ho scritto script per JMP per un po' di tempo). Non sembra essere intuitivo, né riesco a trovare l'aiuto specifico di cui ho bisogno. Quindi sventolo la mia bandiera bianca e chiedo al gruppo.
Il mio script acquisisce le colonne corrette (che variano nel conteggio) e crea correttamente un generatore di grafici con due livelli X nidificati. Il problema è che sebbene la prima variabile che fornisco sia propriamente punti, per qualche motivo il costruttore del grafico assegna box plot a ogni altra variabile (che non si vede da nessuna parte nel mio script). Quindi, sto cercando un modo semplice per trasformare tutte le mie variabili y in punti. Sospetto che implichi il looping di Elements, ma sarò dannato se riesco a trovare come farlo correttamente.
Pensieri? Inoltre, qualcuno ha un buon riferimento per lo scripting dettagliato di Graph Builder?
TIA! Fred
SÌ. Sono d'accordo. Questo è stato anche il mio approccio per apprenderlo, ma è sorprendentemente frustrante rispetto agli altri script. Un'area matura per ulteriori discussioni!
Grazie per l'aiuto. Ho adottato il seguente approccio (attraverso l'iterazione... molti fallimenti!):
1. Ho un elenco di nomi di colonne che voglio inserire nel grafico. È nell'elenco "a" (non mostrato). E' quello che vorrei tracciare.
2. Creo un elenco dalle colonne della tabella dati che corrispondono al mio elenco di ricerca. Queste sono le variabili dell'asse Y esistenti che posso tracciare.
3. Creo un costruttore di grafici e imposto il mio asse X con variabili nidificate. Questo è comune a tutti i miei dati.
4. Quindi eseguo il loop e aggiungo le variabili.
5. Quindi eseguo il loop e aggiungo gli elementi.
6. Quindi eseguo il loop e aggiungo le griglie. E poi finalmente i titoli.
Per i passaggi 4-6, continuavo a mandare in crash JMP se provavo a fare queste cose all'interno di un singolo ciclo. È così che sono arrivato a questo punto. La sceneggiatura funziona (ho dovuto estrarre alcune cose riservate minori), ma non è veloce.
Rispetto ad altri JSL che ho programmato, questo è piuttosto complicato. Non ho mai avuto così tanti arresti anomali di JMP. Ma funziona.
dtname = dt << Get Name();
currentTime = Today();
timeString = "Last Updated " || Format( currentTime, "mm-dd-yyyy" ) ;
// Find columns that match the terms in list "a"
col = dt << get column names( string );
nc = N Items( col );
nsrch = N Items( a );
xxx = {};
For( j = 1, j <= nsrch, j++,
For( i = 1, i <= nc, i++,
If( Uppercase( col[i] ) == Uppercase( a[j] ),
Insert Into( xxx, col[i] ),
)
)
);
colList = xxx;
//Build Basic Chart with nested X variables, no Y variables (yet)
gb = dt << Graph Builder(
Size( 1226, 608 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Subtitle( 1 ),
Variables(
X( :XVar1, Combine( "Nested" ) ),
X( :XVar2, Position( 1 ), Combine( "Nested" ) ),
X( :XVar3, Position( 1 ), Combine( "Nested" ) ),
),
);
gbb = Report( gb )[Graph Builder Box( 1 )];
// I don't know why I have to break these into separate loops, but I tried not to....
// I think it's something to do with needing the "wait".
//Add Y variables.
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Variable( {colList[i], Role( "Y" )} );
If( i == 1,
chrtname = colList[i],
chrtname = chrtname || ", " || colList[i]
);
);
Wait( 1 );
//Remove existing element and replace with points.
For( i = 1, i <= N Items( colList ), i++,
gbb << Remove Element( 1, i, 1 );
gbb << Add Element( 1, i, {Type( "Points" ), X, Y} );
);
Wait( 1 );
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Element( 1, i, {Type( "Line" ), X, Y} )
);
//Set Major Axes
For( i = 1, i <= N Items( colList ), i++,
gbb << Dispatch( {}, colList[i], ScaleBox, {Label Row( Show Major Grid( 1 ) )} ),
);
//Set Various Titles
gb << SendToReport( Dispatch( {}, "graph 1 title", TextEditBox, {Set Text( timeString )} ) );
gb << SendToReport( Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( chrtname || " from " || dtname ), Image Export Display( Normal )} ) );
gb << SendToReport(
Dispatch(
{},
"XVar1",
ScaleBox,
{Label Row( 2, {Major Grid Line Color( 3 ), Show Major Grid( 1 )} ), Label Row( 3, {Major Grid Line Color( 5 ), Show Major Grid( 1 )} )}
)
);
);Gli script JSL di Graph Builder non sono facili da capire.Il mio approccio è modificare il grafico a mio piacimento, quindi fare clic sul triangolo rosso e ottenere lo script risultante.
Tuttavia, se disponi di un numero dinamico di variabili Y, potresti ottenere lo script per 2 o 3 variabili Y e studiare lo script GB per i modelli.Quindi per estenderlo a N Y variabili, costruiresti dinamicamente una stringa contenente lo script gb da eseguire, quindi eseguirla con eval(parse(gb_string)).
Ecco un modo per utilizzare le espressioni. In questo caso mi piace questo approccio perché ho il controllo completo e posso creare l'intera espressione di lancio in una volta sola.
Names Default to Here( 1 );
// open example data
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// a list of columns to plot in Y role was previously created somehow
col = List( :height, :weight );
nc = N Items( col );
// create expression for Variables launch argument with first column,
// using same two nested X variables
vars arg = Eval Expr(
Variables(
X( :age ),
X( :sex, Position( 1 ) ),
Y( Expr( col[1] ) )
)
);
// create expression for Points launch argument with first column
points arg = Eval Expr(
Points( X( 1 ), X( 2 ), Y( 1 ) )
);
// add remaining columns in the Y role
If( nc > 1,
For( c = 2, c <= nc, c++,
Insert Into( vars arg, Eval Expr( Y( Expr( col[c] ), Position( 1 ) ) ) );
Insert Into( points arg, Eval Expr( Y( Expr( c ) ) ) );
);
);
// finish GB launch expression
gb expr = Substitute(
Expr(
Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
vvv,
Elements( ppp )
)
),
Expr( vvv ), Name Expr( vars arg ),
Expr( ppp ), Name Expr( points arg )
);
Eval( gb expr );
Mi rendo conto che questa risposta non è una soluzione completa. Non hai fornito informazioni sufficienti per tentare una soluzione. Inoltre, è meglio per te imparare come risolverlo da solo. Ha lo scopo di illustrare un approccio che potrebbe funzionare per te.
Stai tracciando più colonne nel ruolo Y o utilizzi più oggetti del Costruttore di grafici, uno per ogni colonna?
Beh, ho trovato un po' di soluzione, ma è decisamente instabile.
ho finito:
- creando il grafico iniziale con le variabili x nidificate desiderate, ma senza variabili Y.
- Quindi eseguo un ciclo per aggiungere le variabili Y.
- Quindi aggiungo un altro ciclo per rimuovere l'elemento per ogni Y e aggiungo un nuovo elemento per ogni Y che ha punti.
- Quindi aggiungo un altro ciclo per aggiungere linee della griglia per ogni Y.
Quasi ogni passaggio ha un Wait(1) tra di loro. Inizialmente ho provato un singolo ciclo per ciascuna variabile che eseguiva ciascuna operazione e finora ho bloccato il completamento di JMP da qualche parte circa 10 volte. È stata la mia risoluzione dei problemi che mi ha portato al modulo sopra.
Quindi funziona, ma sicuramente non mi piace il crash di JMP se non codificato correttamente. E apprezzerei comunque che qualcuno mi indicasse un solido riferimento per lo scripting di Graph Builder. Grazie in anticipo!Fred