Versione JMP 17.2.0
MODIFICA: file di dati di esempio caricato con il post principale.
Ho riscontrato un piccolo problema quando ho provato a personalizzare i miei grafici, sia tramite graph builder che tramite JSL (o combo). Ho scandagliato i forum JMP e ho trovato alcuni argomenti simili, ma nessuna soluzione che funzionasse davvero per quello che voglio fare in modo specifico.
Ciò che voglio che JMP faccia è: codificare a colori i miei marcatori in base al numero di test (o nel codice RUN_NUM), scegliere diverse forme di marcatori in base al numero di test, quindi tracciare una linea di adattamento quadratica per ogni numero di test in cui il colore della linea corrisponde al colore dei marcatori per ogni numero di test e la linea di adattamento è sempre una linea tratteggiata per ogni numero di test. L'altra cosa da notare qui è che non voglio assegnare permanentemente colori a test specifici utilizzando una funzionalità come gli stati di colore delle righe. Voglio che il grafico utilizzi lo stesso schema di colori indipendentemente dai numeri di test che traccio, poiché questi dati fanno parte di una tabella di dati in crescita che potrebbe finire con 100-200 test. Ad esempio, se traccio i test 1-5, voglio che vengano sempre tracciati come uno schema di colori come blu, rosso, verde, arancione, viola in modo che se cambio ciò che traccio, diciamo ora Test 1-4 + Test 7 lo schema di colori sia lo stesso per i cinque test tracciati.
Riesco quasi a ottenere tutte le funzionalità di cui sopra, ma non riesco a far corrispondere la codifica colore dei marcatori e della linea di adattamento. Ecco il mio processo finora in graph builder/JSL:
- Rappresento graficamente i miei punti dati in GB, solitamente quattro punti dati per test.
- Trascino 'numero test' nello spazio 'sovrapposto' in GB. Questo codice colore codifica i miei punti dati per test.
- Trascino 'numero test' nello spazio 'colore' in GB. Questo sceglie una forma per ogni test.
- Faccio clic sull'opzione della linea di adattamento che aggiunge la linea al grafico, ma hanno stili di linea diversi e il colore è sempre il blu predefinito di JMP.
Quindi, usando i passaggi precedenti, ci sono vicino ma non ancora del tutto. Utilizzando i forum JMP, ho trovato un buon modo per aggiungere JSL per modificare lo stile e/o il colore della linea, ma non entrambi insieme. Posso salvare il mio grafico GB e quindi modificare un po' il JSL per ottenere l'uno o l'altro.
Nota: nel codice seguente Numero test = RUN_NUM
Aggiungendo questo in cima al codice del mio grafico:
dts = dt << Summary(
Group( :RUN_NUM ),
Freq( "None" ),
Weight( "None" ),
invisible
);
dlist = Column (dts, "RUN_NUM") << get values;
Close (dts, NoSave);
show (dlist);
E aggiungendo questo in fondo al codice del mio grafico:
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Marker Size(8)} )
);
})));
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
2, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Line Style( 2 ), Line Width (1)} )
);
})));
Sono in grado di usare il codice sopra per modificare le proprietà della linea di adattamento. Tuttavia, ho trovato alcune stranezze.
- Così com'è, il codice soprastante modifica lo stile della linea in tratteggiato per ogni linea di adattamento
- Così com'è, il codice soprastante modifica la larghezza della linea per ogni linea di adattamento
- Così com'è, per qualche motivo tutte le linee di adattamento sono colorate di nero
È quasi tutto quello che voglio, tranne che le linee sono nere. Prossima stranezza:
- Se rimuovo "numero test" dalla proprietà "colore" in GB tutte le mie linee di adattamento ora corrispondono al colore del marcatore e cambiano dinamicamente con ogni test selezionato! Sono anche tutte tratteggiate e hanno la larghezza corretta.
- Ora i miei marcatori sono tutti cerchi anziché forme uniche che cambiano quando seleziono test diversi e ignorano la dimensione del marcatore specificata nel codice.
Quindi ora ho capito tutto tranne la forma del pennarello. Ecco dove sono bloccato. Sembra che dovrò convivere con uno di questi due risultati:
- Tutto ciò che voglio, tranne la linea di montaggio, sono sempre linee nere
- Tutto ciò che voglio, tranne le forme dei pennarelli, sono sempre cerchi (e piccoli)

Qualcuno conosce un modo per ottenere tutto ciò che voglio per un grafico personalizzato? Forse c'è qualcosa che non ho capito? Ogni aiuto è molto apprezzato.
Alcune discussioni JMP rilevanti precedenti:
- https://community.jmp.com/t5/Discussions/Match-Line-Color-of-Normal-Quantile-Plot-to-Row-Color-Set-in-Row/mp/124080
- https://community.jmp.com/t5/Discussions/Change-color-theme-in-plot-legend-of-FIt-Curve/td-p/368792
- https://community.jmp.com/t5/Discussions/assign-marker-style-line-style-by-quot-string-quot-or-specific/td-p/48860
Codice GB completo:
dt = Data Table( "DT" );
//this short section makes a list of all runs/tests in the data table
//then all the runs are counted in a later section for a "for loop"
dts = dt << Summary(
Group( :RUN_NUM ),
Freq( "None" ),
Weight( "None" ),
invisible
);
dlist = Column (dts, "RUN_NUM") << get values;
Close (dts, NoSave);
show (dlist);
//below is the graph builder code
gb = Graph Builder(
Size( 850, 600 ),
Show Legend( 1 ),
Show Title( 0 ),
Show Footer( 0 ),
Fit to Window( "Off" ),
Variables(
X( :TEMP ),
Y( :CONVERSION ),
Overlay( :RUN_NUM ),
Color( :RUN_NUM )
),
Elements(
Points( X, Y, Legend( 1 ) ),
Line Of Fit(
X,
Y,
Legend( 2 ),
Degree( "Quadratic" ),
Confidence of Fit( 0 )
)
),
SendToReport(
Dispatch( {"Line Of Fit"}, "", OutlineBox, {Close( 0 )} ),
Dispatch(
{},
"TEMP",
ScaleBox,
{Min( 50 ), Max( 100 ), Inc( 5 ), Minor Ticks( 4 ),
Label Row(
{Show Major Grid( 1 ), Set Font Size( 18 ), Set Font Style( "Bold" )
}
)}
),
Dispatch(
{},
"CONVERSION",
ScaleBox,
{Min( 40 ), Max( 60 ), Inc( 5 ), Minor Ticks( 4 ),
Label Row(
{Automatic Font Size( 0 ), Show Major Grid( 1 ),
Show Minor Grid( 1 ), Set Font Size( 18 ), Set Font Style( "Bold" )}
)}
),
Dispatch(
{},
"X title",
TextEditBox,
{Set Text( "Temperature" ), Set Font Size( 20 ),
Set Font Style( "Bold" )}
),
Dispatch(
{},
"Y title",
TextEditBox,
{Set Text( "Conversion" ), Set Font Size( 20 ),
Set Font Style( "Bold" )}
),
)
);
//this loop goes through all runs and changes lines to dashed and changes their width
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Marker Size(8)} )
);
}
)
)
);
For (i = 0, i < N Items (dlist), i++,
gb << SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
2, //change this legend number to match what is above in graph builder...when modifying this code
Properties (i, {Line Style( 2 ), Line Width (1)} )
);
}
)
)
);
Grazie per la risposta! In base alla mia limitata conoscenza degli stati di riga, non credo di volerli usare. Gli stati di riga funzionano bene per questo set di dati molto piccolo, ma i miei set di dati effettivi comprendono oltre un centinaio di test. Se uso gli stati di riga per assegnare il colore, alla fine i colori si ripeteranno con una tonalità leggermente diversa, quindi avrò test che sono Tonalità di rosso n. 1, Tonalità di rosso n. 2, Tonalità di rosso n. 3, ecc. Quindi, se mi capita di aver bisogno di un grafico di quei test specifici, saranno tutti rossi leggermente diversi e sarà molto difficile distinguerli in base al colore. Preferirei che lo schema di colori fosse legato al grafico, quindi indipendentemente dal sottoinsieme di test che grafico, lo schema di colori è sempre lo stesso, ovvero gli stessi test che sarebbero Tonalità di rosso n. 1, Tonalità di rosso n. 2, Tonalità di rosso n. 3, ecc. con gli stati di riga sarebbero Blu, Rosso, Verde, ecc. con lo schema di colori legato al grafico. Sopra ho menzionato solo il colore, ma credo che lo stesso scenario si verificherebbe anche per le forme dei marcatori, vale a dire che le forme dei marcatori dello stato di riga potrebbero alla fine ripetersi in grandi set di dati, quindi ci sarebbe un sottoinsieme di test che avrebbero tutti le stesse forme dei marcatori.
Per il colore hai più opzioni ed è più facile da gestire rispetto ai marcatori. Attualmente puoi avere solo una colonna per Overlay, quindi molto probabilmente dovrai affidarti al gestore di cambio filtro per mantenere tutti gli stili funzionanti come vuoi. Di default otterrai un grafico come questo

Potresti quindi usare il gestore di cambio filtro per mantenere le dimensioni dei marcatori più alte e lo stile della linea come linee. Con qualcosa del genere JMP ogni tanto fa confusione e dimentica che dovrebbe aggiungere colore
</CODE></PRE>
<P>Penso che potresti anche provare a gestire l'incubo chiamato Legend, ma... lo eviterei se possibile. È una delle peggiori (o forse la peggiore) cose in Graph Builder che puoi e cerchi di manipolare.</P></LINGO-BODY><LINGO-SUB id="lingo-sub-849266" slang="en-US" mode="CREATE">Re: Forza JMP ad abbinare il colore della linea di adattamento al colore del marcatore insieme a uno stile di linea forzato</LINGO-SUB><LINGO-BODY id="lingo-body-849266" slang="en-US" mode="CREATE"><P>La dimensione del marcatore può essere controllata dal menu contestuale ed è un controllo per la casella della cornice.</P>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_0-1742669047885.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/74118i18BC8FCF0D2275C2/jthi_0-1742669047885.png" role="button" title="jthi_0-1742669047885.png" alt="jthi_0-1742669047885.png" /></span></SPAN></SPAN></SPAN></SPAN></P>
<P>Non sono riuscito a trovare nulla di simile per le linee... quindi forse qualcosa del genere potrebbe funzionare</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = Open("$DOWNLOADS/DT.jmp");
gb = dt << Graph Builder(
Size(525, 454),
Show Control Panel(0),
Variables(X(:TEMPERATURE), Y(:CONVERSION), Overlay(:RUN_NUM), Color(:RUN_NUM)),
Elements(Points(X, Y, Legend(5)), Line Of Fit(X, Y, Legend(7), Degree("Quadratic"), Confidence of Fit(0))),
Local Data Filter(Add Filter(columns(:RUN_NUM), Display(:RUN_NUM, N Items(7)))),
SendToReport(Dispatch({}, "Graph Builder", FrameBox, {Marker Size(6), Marker Drawing Mode("Normal")}))
);
l_expr = Expr(Legend Model(7));
Summarize(dt, c = By(:RUN_NUM));
For Each({item}, c,
cur_expr = EvalExpr(Properties(0, {Line Style("Dashed")}, Item ID(Expr(item), 1)));
Insert Into(l_expr, Name Expr(cur_expr));
);
d_expr = EvalExpr(
Dispatch({}, "400", ScaleBox,
{Expr(Name Expr(l_expr))}
)
);
Eval(EvalExpr(Send(gb, Expr(Name Expr(d_expr)))));Names Default To Here(1);
dt = Open("$DOWNLOADS/DT.jmp");
gb = dt << Graph Builder(
Size(525, 454),
Show Control Panel(0),
Variables(X(:TEMPERATURE), Y(:CONVERSION), Overlay(:RUN_NUM), Color(:RUN_NUM)),
Elements(
Points(X, Y, Legend(5)),
Line Of Fit(X, Y, Legend(7), Degree("Quadratic"), Confidence of Fit(0))
)
);
ldf = gb << Local Data Filter(Add Filter(columns(:RUN_NUM), Display(:RUN_NUM, N Items(7))));
Eval(EvalExpr(
f = Function({a},
gb_rep = Expr(Report(gb));
gb << inval;
fb = gb_rep[FrameBox(1)];
segs = fb << Find Segs;
For Each({seg}, segs,
Match(seg << class name,
"MarkerSeg", seg << Set Marker Size(10),
"LineSeg", seg << Set Line Style("Dashed")
);
);
);
));
rs = ldf << Make Filter Change Handler(f);
f(1); // to initialize at least once