Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriHo un set di distribuzioni che contengono una popolazione di unità. Ho utilizzato una selezione con una chiamata containsitem per selezionare gli elementi dell'elenco nel mio set di dati corrispondenti a numeri di ID di riferimento DUT specifici. Ciò aiuta a mostrare quali contenitori contengono le misurazioni per le unità di interesse. Vorrei utilizzare la data del test per ogni istanza della selezione per evidenziare il contenitore contenente le misurazioni. Ad esempio, se la stessa unità è stata testata il 20/06/2024 e successivamente testata di nuovo il 25/06/2024, quindi ancora una volta il 28/06/2024. Il risultato del contenitore del 20/06 verrebbe evidenziato con un colore e il risultato del contenitore del 25/06, 28/06 verrebbe evidenziato con altri due colori. Altri obiettivi sono di avere questi colori coerenti in tutte le distribuzioni nel report (un colore per ogni data del test), con tutte le unità non selezionate che rimangono con il colore predefinito. Vorrei anche che l'evidenziazione fosse dall'alto verso il basso del grafico per il rispettivo contenitore.
Il vostro supporto è molto apprezzato.
//dtmain << select where(:SN=="12346777" | :SN=="12346982");
dtmain << select where(ContainsItem(:SN, {"12346777", "12346982"}));
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :Average ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
Continuous Distribution(
Column( :Min ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
Continuous Distribution(
Column( :Max ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
By(
:TID, :BLOCKNAME, :MEAS_TYPE
)
);

Bozza di ciò che vorrei ottenere:

Analisi e modellazione dei dati di baseAnalisi di affidabilitàRe: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriPotresti scegliere un file adatto dalla cartella degli esempi e creare un mockup che illustri il problema?
I vantaggi:
- risparmia tempo (#1) :
nessun utente ha bisogno di creare un set di dati mockup - risparmia tempo (#2):
aiuta a capire il problema - tutte le risposte saranno basate su un mockup comune
-> facile da confrontare

Ad esempio, con i dati sulla temperatura, la selezione dello stato e i colori per trimestre (invece dei dati originali, la selezione del DUT e i colori per date di misurazione), è questo che ti interessa?
dt = Open( "$SAMPLE_DATA/Functional Data/Weekly Weather Data.jmp" );
dt << New Column( "selected Quarter",
"Ordinal",
Formula( If( Selected(), Quarter( :DATE ) ) ),
Set Property(
"Value Colors",
{1 = -13912408, 2 = -4042310, 3 = -4354269, 4 = -13400361}
)
);
dt << Graph Builder(
Transform Column( "temperature", Formula( Round( :TAVG / 2 ) * 2 ) ),
Size( 568, 328 ),
Show Control Panel( 0 ),
Variables( X( :STATION ), X( :temperature ), Overlay( :selected Quarter ) ),
Elements( Position( 1, 1 ), Bar( X, Overlay( 0 ), Legend( 9 ), Bar Style( "Stacked" ) ) ),
Elements( Position( 2, 1 ), Bar( X, Legend( 1 ), Bar Style( "Stacked" ) ) ),
SendToReport(
Dispatch( {}, "400", ScaleBox,
{Legend Model( 1, Properties( 0, {Fill Color( 32 )}, Item ID( "Missing", 1 ) ) )}
),
Dispatch( {}, "Graph Builder", FrameBox( 2 ), {Fill Selection Mode( "Unselected Faded" )} )
)
);
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriPuoi farlo forse con le linee di riferimento
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Set Bin Width(2),
Process Capability(0)
)
);
ab = Report(dist)[AxisBox(1)];
ab << Add Ref Line({60, 62}, "Solid", "Red", "", 1, 0.25);
ab << Add Ref Line({62, 64}, "Solid", "Green", "", 1, 0.25);
ab << Add Ref Line({64, 66}, "Solid", "Blue", "", 1, 0.25);

o utilizzando script grafici
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Set Bin Width(2),
Process Capability(0)
)
);
fb = Report(dist)[FrameBox(2)];
fb << Add Graphics Script(
1,
Transparency(0.2);
Fill Color("Red");
Rect(68, Y Range() + 10, 70, Y Origin(), 1);
Transparency(0.2);
Fill Color("Light Green");
Rect(70, Y Range() + 10, 72, Y Origin(), 1);
);

Per ottenere la stessa colorazione in tutte le distribuzioni, puoi impostare la proprietà del valore colors per le tue date e utilizzarla quando imposti i colori, oppure creare un elenco di colori e utilizzarli in ordine.
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriEcco il mio punto di vista su come farlo. Trova le righe selezionate e i bin associati a esse, quindi aggiunge le linee di riferimento come richiesto.

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// For illustration, randomly select some rows
For( i = 1, i <= 3, i++,
dt << select rows( Random Integer( 1, N Rows( dt ) ) )
);
dist = dt << Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :height ),
Quantiles( 0 ),
Summary Statistics( 0 ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
)
);
distRPT = Report( dist )[AxisBox( 1 )];
// Find the Midpoints of the bins the selected rows are in
dist << Save( "Level Midpoints" );
theBins = (Associative Array( Column( dt, N Cols( dt ) )[dt << get selected rows] )) << get keys;
dt << delete columns( N Cols( dt ) );
// Get the Increment of the X axis
theIncr = distRPT[AxisBox( 1 )] << get inc;
// Add the reference lines for each selected bin
For Each( {bin, index}, theBins,
binList = {};
Insert Into( binList, bin - theIncr / 2 );
Insert Into( binList, bin + theIncr / 2 );
Eval( Eval Expr( distRPT << Add Ref Line( Expr( binList ), "Solid", Expr( Index + 2 ), "", 1, 0.25 ) ) );
);
Un'espansione di questo tipo, in modo che il grafico cambi interattivamente quando l'utente seleziona e deseleziona righe diverse, richiederebbe l'aggiunta di un gestore RowState e di una logica che prima rimuoverebbe tutte le linee di riferimento esistenti e poi ne aggiungerebbe di nuove.
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriUna domanda a cui rispondere:
come dovrebbero essere assegnati i colori e come dovrebbe essere contrassegnata la gamma.
ad esempio se i dati 6/20 per gli ID selezionati sono: 48, 90 (77, 56, ...).
Oppure il contrario: possiamo essere sicuri che i dati di tutti gli ID dispositivo selezionati in una data siano nello stesso contenitore?
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriAnnotato. Grazie. Adatterò la mia domanda per usare i dati disponibili come hai suggerito.
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriGrazie per il supporto.
Sono riuscito a usare add Ref come hai suggerito tu e @jthi . Ho usato l'approccio per la colorazione e ho confermato che funzionerà per una singola distribuzione. Quando aggiungo condizioni By, perdo la capacità di indirizzamento del grafico, con conseguenti errori.
Come suggerito da @hogi, sono passato ai dati disponibili per questa domanda. Per facilitare la domanda, ho aumentato Big Class in una versione modificata dello script di Jim. Ecco i passaggi che ho seguito e i risultati
1. Importazione di grandi classi
2. Aggiungere in modo condizionale alcuni dati se la colonna "Stato" non è nella tabella
a. Aggiungere una colonna denominata Stato con dati sequenziati per collocare le persone in "CA", "WA" o "OR".
b. Aggiungi un secondo "PATTY" che ha 16 anni, è "F", ha 57 anni, è 134 e vive in "WA".
3. Seleziona alcuni nomi. Ho scelto LESLIE e PATTY
4. Eseguire lo script per trovare ed evidenziare i contenitori di interesse.
OK Case - remove By (:State) from the script below and change the preceding comma to a semicolon to run successfully. The code finds both instances of Patty and uses different colors for each of them. If they had the same height, for this example the reference lines would overlap only showing one of the two colors.
@hogi ha fatto una buona osservazione sull'arbitrato di quale colore viene mostrato. Una volta capito l'indirizzamento dell'elemento, ho intenzione di aggiungere una condizione per il caso in cui più di un punto dati interessante si trovi nello stesso bin.

Caso NG : esegui la distribuzione con una condizione By basata su :State e vedi un errore nell'indirizzamento dell'oggetto grafico. Ho provato alcune permutazioni di indirizzamento senza successo. Mi mancano informazioni chiave per accedere ad AxisBox.
Non ha funzionato neanche:
distRPT = Report( dist )["altezza",AxisBox( 1 )];
distRPT = Report( dist )["Stato=WA","altezza",AxisBox( 1 )];
distRPT = Report( dist["Stato=WA"] )["altezza",AxisBox( 1 )];
Esempio di codice di errore: oggetto non sottoscrivibile alla riga 41 nell'accesso o nella valutazione di 'Report(dist)[ /*###*/AxisBox(1)]' , Report( dist )[/*###*/AxisBox( 1 )]
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name_list = dt << get column names(string);
newColName = "State";
// New column: State
if (!contains(col_name_list, newColName),
Local( {dt, tempStrings},
dt = Data Table( "Big Class" );
dt << New Column( "State", Character, "Nominal" ) << Begin Data Update;
tempStrings = {"CA", "WA", "OR"};
For Each Row( dt, :State = tempStrings[Sequence( 1, 3, 1, 1 )] );
dt << End Data Update;
);
//Make it a double Patty :), another person with the same name.
dt << Add Rows( 1, At End );
//Cheat and use a constant of 41 for the last row index
dt[[41],{name,age,sex,height,weight,State}] = {{"PATTY", 16, "F", 57, 134, "WA"}};
);
// For illustration, select some names
dt << select where( ContainsItem(:name, {"LESLIE","PATTY"}));
dist = dt << Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :height ),
Quantiles( 0 ),
Summary Statistics( 0 ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
By (:State)
);
distRPT = Report( dist )[AxisBox( 1 )];
// Find the Midpoints of the bins the selected rows are in
dist << Save( "Level Midpoints" );
theBins = (Associative Array( Column( dt, N Cols( dt ) )[dt << get selected rows] )) << get keys;
dt << delete columns( N Cols( dt ) );
// Get the Increment of the X axis
theIncr = distRPT[AxisBox( 1 )] << get inc;
// Add the reference lines for each selected bin
For Each( {bin, index}, theBins,
binList = {};
Insert Into( binList, bin - theIncr / 2 );
Insert Into( binList, bin + theIncr / 2 );
Eval( Eval Expr( distRPT << Add Ref Line( Expr( binList ), "Solid", Expr( Index + 2 ), "", 1, 0.25 ) ) );
);
I vostri commenti e consigli sono apprezzati.
Grazie!
Bryan
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriCarino : )
per quanto riguarda "trova la casella dell'asse giusto", questo desiderio nella Lista dei desideri:
Rendi più semplice ottenere risultati dai report tramite JSL
ha lo stato "in coda" - Spero che, oltre a "rendere più facile ottenere risultati dai report", semplifichi anche il modo di trovare la casella dell'asse giusta...
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriLa mia prima ipotesi è che tu stia provando a usare la funzione Report() su un elenco (controlla cosa contiene dist usando Show(dist);) quando stai usando By
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriSe hai bisogno dei gruppi BY, la cosa diventa un po' più complicata.
Ogni sottotrama può avere diverse larghezze di bin. Ecco perché è necessario un ciclo for:
- per ottenere le larghezze individuali dei contenitori.
- per ottenere le righe selezionate per il sottotrama specifico
- per aggiungere le linee di riferimento al sottotrama specifico.
Mmm, forse dovremmo riconsiderare l'idea delle regioni ombreggiate: abbiamo anche il problema con i colori.
Al momento, applichiamo semplicemente un colore diverso a ogni bin selezionato . Le regioni ombreggiate sono belle, ma la larghezza è piuttosto arbitraria. Forse aggiungere semplicemente una riga per ID selezionato? Quanti "ID" vuoi selezionare?
Quando senti odore di nastro adesivo, è il momento di chiedersi: stiamo reinventando la ruota?
In generale Graph Builder può fare queste cose automaticamente, senza dover comunicare con il livello del report...
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name_list = dt << get column names( string );
newColName = "State";
// New column: State
If( !Contains( col_name_list, newColName ),
Local( {dt, tempStrings},
dt = Data Table( "Big Class" );
dt << New Column( "State", Character, "Nominal" ) << Begin Data Update;
tempStrings = {"CA", "WA", "OR"};
For Each Row( dt, :State = tempStrings[Sequence( 1, 3, 1, 1 )] );
dt << End Data Update;
);
//Make it a double Patty :), another person with the same name.
dt << Add Rows( 1, At End );
//Cheat and use a constant of 41 for the last row index
dt[[41], {name, age, sex, height, weight, State}] = {{"PATTY", 16, "F", 57, 134, "WA"}};
);
// For illustration, select some names
dt << select where( Contains Item( :name, {"LESLIE", "PATTY"} ) );
dist = dt << Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :height ),
Quantiles( 0 ),
Summary Statistics( 0 ),
Horizontal Layout( 1 ),
Normal Quantile Plot( 0 ), // disable, if the user enabled it in the preferences :)
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
By( :State )
);
// get all reports
// if there is a BY group, get the info - if there is none, put it into a list
If( Is List( dist ),
dists=dist;
myBys = Transform each ({myexpr} , dist << Get Where Expr, Arg(myExpr , 2 ))
, //no By
dists = Eval List( {dist} );
myBys= {};
);
//get the reports
distRPTs = Transform Each( {dist}, dists, Report( dist ) );
// Find the Midpoints of the bins the selected rows are in
dist << Save( "Level Midpoints" );
//loop though the By groups and add the reflines
For Each( {report, idx}, distRPTs,
//report = distRPTs[2]; idx=2;
selected rows = dt << get selected rows;
// there is a BY group -> restrict the selection
if(N Items(myBys),
Eval( Eval Expr( selected rows = dt << get rows where( Contains( Expr( selected rows ), Row() ) & :State == Expr( myBys[idx] ) ) ) );
);
theBins = (Associative Array( Column( dt, N Cols( dt ) )[selected rows] )) << get keys;
// Get the Increment of the X axis
theIncr = report[AxisBox( 1 )] << get inc;
// Add the reference lines for each selected bin
For Each( {bin, index}, theBins,
//bin = 57; index=1
binList = {};
Insert Into( binList, bin - theIncr / 2 );
Insert Into( binList, bin + theIncr / 2 );
Eval( Eval Expr(report[AxisBox( 1 )] << Add Ref Line( Expr( binList ), "Solid", Expr( Index + 2 ), "", 1, 0.25 ) ) );
);
);
dt << delete columns( N Cols( dt ) );Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoritramite Graph Builder:
New Column( "selected",
Character,
Formula( If( Col Maximum( Selected( Row State() ), :name ), :name, "-" ) )
)
New Window( "try",
H List Box(
Graph Builder( Size( 519, 452 ), Show Control Panel( 0 ), Show Legend( 0 ), Variables( X( :name ) ), Elements( Bar( X ) ) );
gb = Graph Builder(
Size( 487, 500 ),
Show Control Panel( 0 ),
Variables( X( :height ), Wrap( :State ), Color( :selected ) ),
Elements(
Heatmap( X, Legend( 8 ) ),
Histogram( X, Legend( 6 ), Response Scale( "Fill" ) ),
Points( X, Legend( 9 ), Jitter( "None" ) )
),
SendToReport(
Dispatch( {}, "400", ScaleBox,
{Legend Model( 8, Properties( 0, {Transparency( 0 )}, Item ID( "-", 1 ) ) ), Legend Model(
9,
Properties( 0, {Transparency( 0 )}, Item ID( "-", 1 ) )
)}
)
)
);
)
);
(gb << xpath( "//FrameBox" )) << {Marker Drawing Mode( "Outlined" ), Marker Size( 10 ), Transparency( 0.5 ),
Fill Selection Mode( "Unselected Faded" )};
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriGrazie per le risposte. Sono riuscito ad adattare il codice per gestire i grafici Individual. Nella mia analisi ho tre sottotrame per ogni set di condizioni. Ho fatto ricorso all'hardcoding dell'indice dei sottotrame.
If( Is List( rptDist ),
dists=rptDist;
myBys1 = Transform each ({myexpr} , rptDist << Get Where Expr, Arg(myExpr , 1 ));
myBys2 = Transform each ({myexpr} , rptDist << Get Where Expr, Arg(myExpr , 2 ));
myBys3 = Transform each ({myexpr} , rptDist << Get Where Expr, Arg(myExpr , 3 ));
, //else condition - no By conditions in Distribution call
dists = Eval List( {rptDist} );
myBys= {};
);Verso una nuova sfida. in cui l'uso di chiamate Associative Array sta perdendo informazioni. Creerò un post separato per la prossima sfida poiché l'obiettivo di tracciamento qui è stato raggiunto.
Grazie a tutti!
Re: Evidenzia i contenitori in una distribuzione in base al valore di una colonna per evidenziare la migrazione dei contenitoriCiao Jarmo,
I've added the nested for loops which achieved the desired result. Without the second loop the added reference would only appear in the first of the three plots. Please note that I assigned numOfPlots a constant value of 3. I was looking for a way to interrogate the report(AxisBox... for dimensions, but I did not find the right object to return the correct count.
In totale ci sono tre cicli for nidificati per produrre distribuzioni e annotarle con linee di riferimento.
...
For Each( {report, idx}, distRPTs, //grab each report in the
...
For Each( {bin, index}, theBins, //process bin for each report
...
For( iPlot = 1, iPlot <= numOfPlots, iPlot +=1, << add refer. in each of the subplots.
...
...<BR />For Each( {bin, index}, theBins,
binList = {};
//TBD change bin width to avoid offset when bin width is an odd number
Insert Into( binList, bin - theIncr / 2 );
Insert Into( binList, bin + theIncr / 2 );
For( iPlot = 1, iPlot <= numOfPlots, iPlot +=1,
Eval( Eval Expr(report[AxisBox( iPlot )] << Add Ref Line( Expr( binList ), "Solid", Expr( Index + 2 ), "", 1, 0.25 ) ) );
);
);