Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?Il seguente script di esempio da an discussione precedente (risolto grazie a @jthi ) mi permettono di tracciare la variabile Y come punti da una lista.
Voglio aggiungere Diagrammi a scatola inoltre Punti nel mio grafico. Come aggiungere box plot nello script seguente?
Names Default To Here(1);
dt = Open("$sample_data\Big Class.jmp");
y_values = {"name", "age", "sex", "weight"};
variables_expr = Expr(Variables(X(:height)));
For Each({y_col}, y_values,
temp_expr = Expr(Y());
Insert Into(temp_expr, Name Expr(AsColumn(dt, y_col)));
Insert Into(variables_expr, Name Expr(temp_expr));
);
gb_expr = Expr(Graph Builder(
Show Control Panel(0)
));
Insert Into(gb_expr, Name Expr(variables_expr));
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
Insert Into(gb_expr,
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
)
));
);
Show(Name Expr(gb_expr));
Eval(gb_expr);Automazione e scriptingfinestreRi: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?Crea il grafico in modo interattivo in JMP

porta lo script negli appunti/nella finestra dello script
Graph Builder(
Show Control Panel(0),
Variables(X(:height), Y(:name), Y(:age), Y(:sex), Y(:weight)),
Elements(Position(1, 1), Points(X, Y, Legend(1)), Box Plot(X, Y, Legend(5))),
Elements(Position(1, 2), Points(X, Y, Legend(2)), Box Plot(X, Y, Legend(6))),
Elements(Position(1, 3), Points(X, Y, Legend(3)), Box Plot(X, Y, Legend(7))),
Elements(Position(1, 4), Points(X, Y, Legend(4)), Box Plot(X, Y, Legend(8))),
SendToReport(
Dispatch(
{},
"400",
LegendBox,
{Legend Position(
{1, [0], 5, [4, -3], 2, [1], 6, [5, -3], 3, [2], 7, [6, -3], 4, [3],
8, [7, -3]}
)}
)
)
)
Scopri cosa deve essere modificato per includere BoxPlots quando il generatore di grafici originale è così
Graph Builder(
Show Control Panel(0),
Variables(X(:height), Y(:name), Y(:age), Y(:sex), Y(:weight)),
Elements(Position(1, 1), Points(X, Y, Legend(1))),
Elements(Position(1, 2), Points(X, Y, Legend(2))),
Elements(Position(1, 3), Points(X, Y, Legend(3))),
Elements(Position(1, 4), Points(X, Y, Legend(4)))
)
Torna al tuo script e prova piccole modifiche. Puoi vedere abbastanza facilmente che ti manca qualcosa da Elements e in base alla tua sceneggiatura originale
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
sembra che dovresti semplicemente provare ad aggiungere il Box Plot nel formato corretto lì
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?Esegui il grafico.
Apri il Pannello di controllo
Aggiungi i box plot che desideri.
Chiudere il Pannello di controllo
Vai al triangolo rosso e seleziona
Salva => Finestra da script a script
Esaminare il codice e modificare lo script per aggiungere gli elementi aggiuntivi presenti nel nuovo script e non nel vecchio script.
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?Esegui il tuo JSL, quindi modifica il grafico come desideri che appaia, quindi salva il JSL dal nuovo grafico.Aggiungi il nuovo JSL a questa traccia di discussione e gli darò un'occhiata.
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?@txnelson Ho fatto esattamente questo, ho aggiunto i box plot in modo interattivo, quindi ho controllato lo script risultante, ho apportato le modifiche al mio script originale, ma non sono ancora riuscito a far funzionare i box plot.Immagino di non essere ancora bravo a individuare ciò che manca/è necessario.
Proverò @jthi suggerimento ora.
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?@txnelson Quanto segue è vicino al mio caso reale.
Names default To Here (1);
Clear Log ();
dt = Open("$sample_data\Semiconductor Capability.jmp");
y_values = {"NPN1", "IVP1", "PNP4", "NPN4"};
variables_expr = Expr(Variables(X(:lot_id)));
For Each({y_col}, y_values,
temp_expr = Expr(Y());
Insert Into(temp_expr, Name Expr(AsColumn(dt, y_col)));
Insert Into(variables_expr, Name Expr(temp_expr));
);
gb_expr = Expr(Graph Builder(
Show Control Panel(0)
));
Insert Into(gb_expr, Name Expr(variables_expr));
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
Insert Into(gb_expr,
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
)
));
);
Show(Name Expr(gb_expr));
Eval(gb_expr); che dà

Tuttavia, vorrei qualcosa di simile al seguente

Lo script generato da JMP per il quale è
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :lot_id ), Y( :NPN1 ), Y( :IVP1 ), Y( :PNP4 ), Y( :NPN4 ) ),
Elements(
Position( 1, 1 ),
Points( X, Y, Legend( 1 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 5 ), Jitter( "None" ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y, Legend( 2 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 6 ), Jitter( "None" ) )
),
Elements(
Position( 1, 3 ),
Points( X, Y, Legend( 3 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 7 ), Jitter( "None" ) )
),
Elements(
Position( 1, 4 ),
Points( X, Y, Legend( 4 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 8 ), Jitter( "None" ) )
),
SendToReport(
Dispatch(
{},
"400",
LegendBox,
{Legend Position(
{1, [0], 5, [4, -3], 2, [1], 6, [5, -3], 3, [2], 7, [6, -3], 4, [3],
8, [7, -3]}
)}
)
)
);La domanda è: come modificare lo script principale in questo post per includere il box plot oltre ai punti?
L'aggiunta di Box Plot () appena sotto Points () non mi dà entrambi.
Immagino che il mio posizionamento per Box Plots () non sia corretto. Hai bisogno di aiuto qui.
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?Penso che tu abbia utilizzato i valori anomali "Box Plot" predefiniti.
Stai cercando il metodo quantile "Box Plot" che collega tutti i punti?

Graph Builder(
Size( 1135, 705 ),
Show Control Panel( 0 ),
Variables(
X( :“S-b"n ),
Y( :C),
Color( :“S-b"n )
),
Elements( Box Plot( X, Y, Legend( 4 ), Box Type( "Quantile" ) ) )
);
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?Sono state necessarie modifiche molto minori per produrre il grafico desiderato.
Il JSL prodotto dallo script iniziale che esegue il Graph Builder è
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :lot_id ), Y( :NPN1 ), Y( :IVP1 ), Y( :PNP4 ), Y( :NPN4 ) ),
Elements( Position( 1, 1 ), Points( X, Y, Legend( 1 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 2 ) ) ),
Elements( Position( 1, 3 ), Points( X, Y, Legend( 3 ) ) ),
Elements( Position( 1, 4 ), Points( X, Y, Legend( 4 ) ) )
);
Quando si guarda il JSL che ha creato il codice del Graph Builder sopra, solo 2 sezioni fanno il vero lavoro.
gb_expr = Expr(Graph Builder(
Show Control Panel(0)
));
Crea la shell per il Costruttore di grafici
Graph Builder(
Show Control Panel( 0 ),
);
La JSL
variables_expr = Expr(Variables(X(:lot_id)));
For Each({y_col}, y_values,
temp_expr = Expr(Y());
Insert Into(temp_expr, Name Expr(AsColumn(dt, y_col)));
Insert Into(variables_expr, Name Expr(temp_expr));
);
Genera il codice
Variables( X( :lot_id ), Y( :NPN1 ), Y( :IVP1 ), Y( :PNP4 ), Y( :NPN4 ) )
Poi,
Insert Into(gb_expr, Name Expr(variables_expr));
Inserisce le Variabili( X(.................) JSL nel codice del Costruttore di grafici()
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :lot_id ), Y( :NPN1 ), Y( :IVP1 ), Y( :PNP4 ), Y( :NPN4 ) )
);
Ora quello che bisogna fare è costruire
Elements( Position( 1, 1 ), Points( X, Y, Legend( 1 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y, Legend( 2 ) ) ),
Elements( Position( 1, 3 ), Points( X, Y, Legend( 3 ) ) ),
Elements( Position( 1, 4 ), Points( X, Y, Legend( 4 ) ) )
Il JSL che crea queste righe di codice è
For Each({y_col, idx}, y_values,
Eval(EvalExpr(
Insert Into(gb_expr,
Name Expr(Elements(Position(1, Expr(idx)), Points(X, Y, Legend(Expr(idx)))))
)
));
);
Esegue il ciclo attraverso ciascuno dei valori Y e crea la riga Elements una alla volta e la inserisce nel Graph Builder() JSL.
Finalmente,
Eval(gb_expr);
Esegue il Graph Builder JSL completato
Quindi ora, cosa deve essere cambiato.
Fondamentalmente se si guarda cosa c'è di diverso tra il JSL creato dallo script originale e il JSL salvato dal Costruttore di grafici con le nuove modifiche, nell'output dello script originale, la struttura degli Elementi è
Elements( Position( 1, 1 ), Points( X, Y, Legend( 1 ) ) )
Dove la sezione Elementi del codice salvato ha una sezione sia per Punti che per Box Plot
Elements(
Position( 1, 1 ),
Points( X, Y, Legend( 1 ), Jitter( "None" ) ),
Box Plot( X, Y, Legend( 5 ), Jitter( "None" ) )
)
Pertanto, tutto ciò che deve essere modificato è aggiungere questa seconda sezione al codice che genera la sezione Elementi.
For Each( {y_col, idx}, y_values,
Eval(
Eval Expr(
Insert Into(
gb_expr,
Name Expr(
Elements(
Position( 1, Expr( idx ) ),
Points( X, Y, Legend( Expr( idx ) ), jitter( "None" ) ),
Box Plot( X, Y, Legend( Expr( N Items( y_values ) + idx ), jitter( "None" ) ) )
)
)
)
)
)
);
Se metti tutto insieme, il nuovo script lo è
Names Default To Here( 1 );
Clear Log();
dt = Open( "$sample_data\Semiconductor Capability.jmp" );
y_values = {"NPN1", "IVP1", "PNP4", "NPN4"};
variables_expr = Expr(
Variables( X( :lot_id ) )
);
For Each( {y_col}, y_values,
temp_expr = Expr( Y() );
Insert Into( temp_expr, Name Expr( As Column( dt, y_col ) ) );
Insert Into( variables_expr, Name Expr( temp_expr ) );
);
gb_expr = Expr(
Graph Builder( Show Control Panel( 0 ) )
);
Insert Into( gb_expr, Name Expr( variables_expr ) );
For Each( {y_col, idx}, y_values,
Eval(
Eval Expr(
Insert Into(
gb_expr,
Name Expr(
Elements(
Position( 1, Expr( idx ) ),
Points( X, Y, Legend( Expr( idx ) ), jitter( "None" ) ),
Box Plot( X, Y, Legend( Expr( N Items( y_values ) + idx ), jitter( "None" ) ) )
)
)
)
)
)
);
Show( Name Expr( gb_expr ) );
Eval( gb_expr );Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?@txnelson Grazie.
Non mi sarebbe venuto in mente una cosa del genere facilmente.
Box Plot( X, Y, Legend( Expr( N Items( y_values ) + idx ), jitter( "None" ) ) )
Come posso modificare gli indicatori predefiniti in Punti per dire un "+" o un "quadrato". Questo non risolve il problema
Points( X, Y, Legend( Expr( idx ) ), jitter( "None" ), marker ("square") )Modificando il marcatore mostra in modo interattivo che devo dirigere la modifica del marcatore tramite sendToReport () per ogni variabile Y. Come farlo tutto in una volta per tutte le variabili Y?
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?A seconda di dove lo fai, dove vedere cosa sarà diverso. Ecco un esempio se lo fai da Legend:
Cambialo dalla leggenda e otterrai qualcosa di simile
{Legend Model(4, Properties(0, {Marker("Circle")}, Item ID("NPN4", 1)))}
Quindi cerca Legend Model da Scripting Index

Prendi lo script da lì, modificalo per adattarlo alle tue esigenze ma mantienilo il più semplice possibile (aggiungi un secondo asse Y) e testalo
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(528, 448),
Show Control Panel(0),
Variables(X(:sex), Y(:height), Y(:weight)),
Elements(Position(1, 1), Points(X, Y, Legend(3))),
Elements(Position(1, 2), Points(X, Y, Legend(1)))
);
server = gb << Get Legend Server;
item = server << Get Legend Item(1, 1);
item << Set Properties({Marker("Circle")});
Sei riuscito a cambiare i marcatori su una trama. Quindi ti chiedi: come posso modificarli su tutti i grafici? Quindi esplora lo script in modo più dettagliato e sembra che siano forniti alcuni indici
item = server << Get Legend Item(1, 1);
controlla << Ottieni l'elemento Legend dall'indice di scripting e spera che sia lì e se non lo è esplora altri oggetti correlati alla legenda e spera che funzionino in modo simile (o prova semplicemente a inviare messaggi al server << ottieni lege Ctrl+Spazio Qui).
server << Get Legend Items;
{{LegendModelItem(Label("height"), Type("Marker"))},
{LegendModelItem(Label("weight"), Type("Marker"))}}
Ora hai un elenco di elementi della legenda. Prova a scorrere l'elenco e vedere cosa succede
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(528, 448),
Show Control Panel(0),
Variables(X(:sex), Y(:height), Y(:weight)),
Elements(Position(1, 1), Points(X, Y, Legend(3))),
Elements(Position(1, 2), Points(X, Y, Legend(1)))
);
server = gb << Get Legend Server;
For Each({item}, server << Get Legend Items,
item << Set Properties({Marker("Circle")});
);
L'opzione più semplice è impostare gli indicatori come stati di riga nella tabella dati se funziona per te.
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?@jthi Grazie. Esiste un modo per modificare gli indicatori quando i punti vengono tracciati per primi anziché ottenere successivamente un handle per il server delle legende e quindi modificare gli indicatori per ciascuna variabile Y?
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?C'è un motivo per cui non è stato possibile modificarli dopo?
Potresti utilizzare SendToReport e creare il modello Legend all'interno della parte Dispatch con idee simili a quelle con cui sono state create altre parti nel tuo script.
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?@jthi Certo le cose potrebbero essere cambiate dopo. Cambiare i marcatori mentre i punti venivano tracciati mi è sembrato un percorso più semplice.
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?@jthi @txnelson Nello script principale riportato di seguito, ho aggiunto Local Data Filter () sotto Eval() che funziona come previsto
Eval( gb_expr <<LOCAL data="https://community.jmp.com/" filter=""></LOCAL>
ma se aggiungo lo script per aggiornare i marcatori, il grafico viene tracciato due volte!
Eval(
server = gb_expr << Get Legend Server;
For Each( {item}, server << Get Legend Items, item << Set Properties( {Marker( "Circle" )} ) );
);<BR />
Names Default To Here( 1 );
Clear Log();
dt = Open( "$sample_data\Semiconductor Capability.jmp" );
y_values = {"NPN1", "IVP1", "PNP4", "NPN4"};
variables_expr = Expr(
Variables( X( :lot_id ) )
);
For Each( {y_col}, y_values,
temp_expr = Expr( Y() );
Insert Into( temp_expr, Name Expr( As Column( dt, y_col ) ) );
Insert Into( variables_expr, Name Expr( temp_expr ) );
);
gb_expr = Expr(
Graph Builder( Show Control Panel( 0 ) )
);
Insert Into( gb_expr, Name Expr( variables_expr ) );
For Each( {y_col, idx}, y_values,
Eval(
Eval Expr(
Insert Into(
gb_expr,
Name Expr(
Elements(
Position( 1, Expr( idx ) ),
Points( X, Y, Legend( Expr( idx ) ), jitter( "None" ) ),
Box Plot( X, Y, Legend( Expr( N Items( y_values ) + idx ), jitter( "None" ) ) )
)
)
)
)
)
);
//Show( Name Expr( gb_expr ) );
Eval( gb_expr <<LOCAL data="https://community.jmp.com/" filter=""></LOCAL>Il secondo grafico è con i marcatori aggiornati.
Come tracciare un singolo grafico con gli indicatori aggiornati insieme al filtro dati locale?
Immagino di non essere in grado di posizionare correttamente l'ultimo pezzo per il cambio del marcatore dove chiedo aiuto.
Ri: Come aggiungere box plot ai punti quando vengono fornite le variabili Y come elenco al generatore di grafici?Non vuoi eseguire gb_expr due volte. Vuoi ottenere il riferimento che ottieni da gb_expr e inviargli quei messaggi
gb = Eval( gb_expr );
gb << Local data Filter(...)
server = gb << get legend server;