Legenda forza con indicatore e colore dello stato della rigaCiao,
Sto cercando di creare una legenda con pennarelli e colori, ma vorrei sceglierli. Ho pensato che sarebbe stato facile grazie allo stato della riga (stato del colore, stato del marcatore, combinazione di stati). Ma una volta assegnati colore e indicatore a ciascuna riga, non riesco a trovare un modo per forzarli nella legenda.
Vorrei farlo tramite script (stavo pensando di aggiungere un riquadro con la legenda), ma non riesco a trovare un modo per gestire i "marcatori" che ho creato.
Grazie
Ri: Legenda forzata con indicatore e colore dello stato della rigaGrazie Ian,
è più vicino alla mia idea iniziale ed è facile da integrare nella mia sceneggiatura.
Quindi preferisco leggermente questa soluzione, anche se l'altra funziona bene.
Ri: Legenda forzata con indicatore e colore dello stato della rigaNon ho capito come farlo con uno script, ma se vai su Righe>Colore o Segna per colonna
ottieni quanto segue

Ora puoi fare clic con il pulsante destro del mouse sulla legenda e modificarla come desideri, e se hai selezionato "Crea finestra con legenda" creerà una legenda per te. Questo ha l'ulteriore vantaggio di selezionare nella tabella tutto ciò che hai selezionato nella legenda.
Puoi fare lo stesso all'interno degli script con:
Names Default to here(1);
dt = Open("$SAMPLE_DATA\Big CLass.jmp");
legend = dt << Marker By Column(:age);
new window("Not Really",
Hlistbox(
bivariate(Y(:height), X(:weight)),
legend
)
)
Ma perdi (almeno non ho trovato un modo per farlo) la personalizzazione che cerchi
Ri: Legenda forzata con indicatore e colore dello stato della rigaIn alternativa, potresti prendere in considerazione l'utilizzo di "MarkerSeg". Nel codice sottostante "dt" è una tabella di tutti i livelli distinti della colonna che desideri colorare e contrassegnare. Potresti utilizzare "Tabelle > Riepilogo" e renderlo invisibile.
NamesDefaultToHere(1);
// Example data table (markers and colors assigned by 'Lot ID')
dt = New Table( "Rows With Colors and Markers",
Add Rows( 12 ),
New Column( "Lot ID",
Character,
"Nominal",
Set Values(
{"lot1", "lot10", "lot11", "lot12", "lot13", "lot2", "lot3", "lot4",
"lot5", "lot6", "lot7", "lot8"}
),
Lock( 1 )
),
Set Row States(
[896.813481688499, 1104.17848521471, 34064.2516910434, 1584.79095828533,
1856.1745531559, 34848.5869575739, 35120.7292968035, 2704.17450988293,
2976.75480300188, 3200.51829791069, 3408.21706777811, 36368.77437675]
)
);
// Make legend window with MarkerSeg
n = NRow(dt);
xx = J(n, 1, 1);
yy = Transpose(1::n);
legendList = Column(dt, "Lot ID") << getValues;
gb = Graph Box(
FrameSize( 150, 300*(n/16) ),
Y Scale( 0, n+1 ),
X Scale( 0, 6 ),
Y Name(" "),
X Name(" "),
Y Axis(ShowLabels(0), ShowMajorTicks(0), ShowMinorTicks(0)),
X Axis(ShowLabels(0), ShowMajorTicks(0), ShowMinorTicks(0)),
Marker Seg( xx, yy, Row States( dt ) ),
For( i = 1, i<=n, i++, Text( {1.5, i-0.1}, legendList[i] ) )
);
db = PanelBox("Row State Colours and Markers for 'Lot ID'", gb);
New Window( "My Legend", db);
Ri: Legenda forzata con indicatore e colore dello stato della rigaSembra essere una buona soluzione. Ora devo adattarlo al mio caso. Molte grazie!
Sono solo deluso dallo stato di fila!
Ri: Legenda forzata con indicatore e colore dello stato della rigaSe guardi
Aiuto==>Indice degli script
e guarda sia gli elementi del Costruttore di grafici che quelli della Legend Box(), la manipolazione della legenda dopo l'esecuzione del Costruttore di grafici è limitata. Tuttavia, puoi utilizzare una tecnica che funziona per qualsiasi cosa, ma è un po’ macchinosa. Se generi una stringa letterale, che contiene il codice necessario per far sì che il Costruttore di grafici faccia ciò che desideri, puoi quindi eseguire quella stringa letterale. Ecco un esempio molto primitivo, ma penso che vedrai che tipo di cose puoi farci
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\big class.jmp" );
Summarize( dt, groups = by( dt:sex ) );
numofgroups = N Items( groups );
TheCode =
"Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
\!"400\!",
ScaleBox,
{Legend Model(
1,";
For( i = 0, i <= numofgroups - 1, i++,
Show( i );
TheCode = TheCode || "Properties(" || Char( i ) || ", {Line Color (" || Char( i + 3 ) || "),Marker( " || Char( 16 - i ) || ")}),";
);
TheCode = TheCode || "Dispatch( {}, \!"400\!", LegendBox, {Legend Position( {1, [2, 3], 1, [0, 1]} ), Position( {2, 3, 0, 1} )} ))';";
Eval( Parse( TheCode ) );Ri: Legenda forzata con indicatore e colore dello stato della rigaGrazie Jim
1. Sono d'accordo che non è un vero problema... Posso ottenere l'elenco con un po' di lavoro!
2. Forse non sono stato abbastanza chiaro. Posso facilmente, come hai detto, ottenere il numero (N) dell'articolo da modificare nella legenda. Significa che dovrò creare N righe nello script creando il graphbuilder (devo inviare N righe con "legend box(properties(0...N)"). Ma se costruisco un grafico con N+1 linee nella casella della legenda funzionerà in parte (la N+1 linea non verrà modificata). Quindi devo creare un ciclo all'interno dello script che crea il graphbuilder (è fattibile?) o dopo lo script che crea il graphbuilder (ha più senso, ma non riesco a trovare i messaggi che posso inviare a legendbox) .
Ri: Legenda forzata con indicatore e colore dello stato della riga1. I marcatori sono numerati come si può vedere nella tabella qui sotto. Questo è stato generato da uno script, come dimostrato nella guida allo scripting
Aiuto==>Libri==>Guida allo scripting

Ad alcuni marcatori sono assegnati dei nomi, che hai visto nello script del Costruttore di grafici. Non conosco alcun elenco con questi nomi, ma puoi sempre eseguire in modo interattivo un generatore di grafici e assegnare il marcatore che desideri, quindi visualizzare lo script che ha prodotto e vedere se ti dà un nome e non solo un numero.
2. La legenda verrà elencata in ordine alfabetico o numerico, a meno che non sia attivato Ordinamento valore o Livello ordine riga. A livello di programmazione, puoi determinarlo e quindi modificare il codice. Per quanto riguarda la ricerca delle età nella tabella dati, la funzione Summarize() è quella che utilizzo la maggior parte del tempo
riepilogo(dt,pergruppo = Per(:Età));
La variabile "bygroup" avrà un elenco di tutte le diverse età trovate.
N elementi (per gruppo);
Fornisce il numero di età diverse trovate
Ri: Legenda forzata con indicatore e colore dello stato della rigaGrazie per la risposta rapida,
1/ Può funzionare a patto di avere un set completo di nomi di marcatori (ho trovato nella documentazione i colori standard JMP). Sai dove posso trovare qualcosa di equivalente per i nomi dei marcatori?
2/ In tal caso, se colori e marcatori sono scritti in una tabella dedicata, posso modificare ogni riga della legenda tramite un (eval(substitute(expr(graphbuilder(color1,marker1),expr(color1),mycolor, expr( marcatore1),miomarcatore))). Funziona, bel passo avanti, ma ho bisogno di sapere il numero dell'articolo nella legenda per poter effettuare la sostituzione.
Per renderlo più chiaro per il file "big class", se la sovrapposizione è realizzata con :AGE e se non conosco le AGE nel file, come posso fare?
Forse potrei farlo in loop (dopo il generatore di grafici), se fossi in grado di inviare un messaggio al legendbox. Ma non riesco a trovare nella documentazione messaggi che modificano l'elemento...E infine il nodo dell'albero è "vuoto" nel nodo legendbox.
Ri: Legenda forzata con indicatore e colore dello stato della rigaIl modo più semplice che ho trovato affinché JMP gestisca questo problema è modificare la legenda, e quindi il grafico utilizzando JSL, in modo che corrisponda agli stati della riga. Ecco uno script che mostra come modificare la legenda nel Costruttore di grafici.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\big class.jmp" );
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 1 ) ) ),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
1,
Properties( 0, {Marker( "FilledTall" )} ),
Properties( 1, {Line Color( 1 ), Line Style( "Dashed" ), Marker( "Filled Diamond" )} )
), Legend Model(
1,
Properties( 0, {Marker( "FilledTall" )} ),
Properties( 1, {Line Color( 1 ), Line Style( "Dashed" ), Marker( "Filled Diamond" )} )
)}
),
Dispatch( {}, "400", LegendBox, {Legend Position( {1, [2, 3], 1, [0, 1]} ), Position( {2, 3, 0, 1} )} )
)
);
Produce quanto segue
