Come aggiungere linee orizzontali dinamiche con un asse y condiviso in un grafico di variabilità con asse x raggruppato con valori ripetuti di N diversi?Ciao a tutti,
Volevo creare un nuovo thread per differenziarmi in base al mio post precedente: https://community.jmp.com/t5/Discussions/How-to-add-Dynamic-horizontal-line-by-shared-y-axis-among /mp/622722 . La stessa idea deve essere applicata laddove vorrei una linea orizzontale dinamica attraverso un grafico di variabilità, ma a differenza della soluzione precedente che utilizza un array associativo poiché esiste un valore per x, questo caso ha potenzialmente più valori per raggruppamento x in cui rappresentare graficamente basato su N per x non funziona poiché N è suddiviso tra le condizioni e deve essere disegnato come tale. È qui che faccio fatica a capire come farlo e apprezzerei che qualcuno con più esperienza di scripting grafico mi aiutasse, se possibile. Di seguito è riportato l'output desiderato con linee disegnate a mano, ad esempio, e di seguito è riportato anche il codice per generare il grafico.
Nell'esempio seguente, Toyota è ora divisa tra :Protezione in cui c'è N=8 e N=3 e allo stesso modo Ford è N=11 e N=3 per i raggruppamenti e vorrei garantire che sia i gruppi Toyota che i gruppi Ford tra gli altri hanno una linea orizzontale con il valore Max(:Wt) come mostrato dalle linee rosse e blu e tutti gli altri hanno una linea altrettanto unica come mostrato dalle linee viola. Qualsiasi idea su come realizzarlo sarebbe fantastica. In fondo al post, il codice fornito da @ErraticAttack è pubblicato come un meraviglioso modello per raggruppare e rappresentare graficamente ma poiché è un array associativo direbbe che Toyota è N: 8+3 = 11 e allo stesso modo Ford è 11+3=14 wide e rappresentare graficamente gli intervalli in modo errato poiché ora sono suddivisi. 
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
rpt = dt << Variability Chart(
Y( :Head IC),
X( :Protection, :Make, :Model ),
Analysis Type( "Choose best analysis (EMS REML Bayesian)" ),
Show Range Bars( 0 ),
Show Cell Means( 0 ),
Std Dev Chart( 0 ),
Points Jittered( 1 ),
By( :NAME("D/P")),
);Il codice di @ErraticAttack per aiutare la mia domanda precedente.
names default to here(1);
dt =
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Cars.jmp" );
rpt = dt << Variability Chart(
Y( :Head IC),
X( :Make, :Model ),
Analysis Type( "Choose best analysis (EMS REML Bayesian)" ),
Show Range Bars( 0 ),
Show Cell Means( 0 ),
Std Dev Chart( 0 ),
Points Jittered( 1 ),
Where( :NAME("D/P") == "Driver" & :Protection == "manual belts" ),
);
//find groupings:
rows = dt << Get Rows Where( :NAME("D/P") == "Driver" & :Protection == "manual belts" );
subt = dt << Subset( Rows( rows ), Columns( :Make, :Model, :Wt ), Not Linked, Private );
sumt = subt << Summary( Group( :Make, Model ), Mean( :Wt ), Statistics Column Name Format( "Column" ), Link to Original Data Table( 0 ), Private );
Close( subt, No Save );
subt = sumt << Summary( Group( :Make ), Mean( :Wt ), Statistics Column Name Format( "Column" ), Link to Original Data Table( 0 ), Private );
Close( sumt, No Save );
category number = [=>];
category average = [=>];
For Each Row( subt,
category number[:Make] = :N Rows; // each least-significant category in a VariabilityPlot is exactly X=1 width on the hidden x-axis, starting at zero
category average[:Make] = :Wt
);
Close( subt, No Save );
tree = rpt << Report;
Eval( Eval Expr(
tree[FrameBox( 1 )] << Add Graphics Script(
Local( {values = Expr( category average ), numbers = Expr( category number ), i, items, sum = 0},
items = numbers << Get Keys;
Pen Size( 2 );
Pen Color( "Blue" );
Summation( i = 1, N Items( items ),
Line( Eval List( {sum, values[items[i]]} ), Eval List( {sum += numbers[items[i]], values[items[i]]} ) );
0
)
)
)
) )Grazie, apprezzo davvero qualsiasi aiuto!
Automazione e scriptingAnalisi e modellazione dei dati di baseEsplorazione e visualizzazione dei datiPersonalizzazione di massafinestreRi: Come aggiungere linee orizzontali dinamiche con un asse y condiviso in un grafico di variabilità con asse x raggruppato con valori ripetuti di N diversi?Grazie Jim!
Ri: Come aggiungere linee orizzontali dinamiche con un asse y condiviso in un grafico di variabilità con asse x raggruppato con valori ripetuti di N diversi?Alla linea 37 devi cambiare da
fb = Report(varchart)[i][FrameBox(1)];
A
fb = Report( varchart[i] )[FrameBox( 1 )];
Ri: Come aggiungere linee orizzontali dinamiche con un asse y condiviso in un grafico di variabilità con asse x raggruppato con valori ripetuti di N diversi?Ciao @jthi ,
Grazie per la soluzione, c'è una risposta abbastanza elegante. Come hai detto, è solo per un Framebox e idealmente mi piacerebbe che funzionasse per entrambi i framebox generati dal grafico della variabilità. Ho adattato il tuo codice a questo, ma non riesco a far apparire le linee orizzontali per entrambi. Se potessi vedere l'errore e sapere come procedere, sarebbe fantastico. Grazie!
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cars.jmp");
varchart = dt << Variability Chart(
Y(:Head IC),
X(:Protection, :Make, :Model),
Analysis Type("Choose best analysis (EMS REML Bayesian)"),
Show Range Bars(0),
Show Cell Means(0),
Std Dev Chart(0),
Points Jittered(1),
By(:"D/P"n)
);
dt << new column("Group", Character, Nominal, Formula(
:"D/P"n || :Protection || :Make // don't add model here
));
dt_summary = dt << Summary(
Group(:Group),
Max(:Wt),
N Categories(:Model),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0),
//Invisible
);
uniq = Associative Array( Column( dt, "D/P" ) << GetValues ) << GetKeys;
for(i = 1, i <= N Items(uniq), i++,
dt_summary_subset = dt_summary << Subset( Rows( dt_summary << get rows where(Substr(:Group, 1, Length(uniq[i])) == uniq[i])),
Columns(), Not Linked);
weights = dt_summary_subset[0, "Wt"];
counts = dt_summary_subset[0, "Model"];
fb = Report(varchart)[i][FrameBox(1)];
Eval(Eval Expr(
fb << Add Graphics Script(
Local({refs = Expr(weights), counts = Expr(counts), i, sum = 0},
Pen Size(2);
Pen Color("Blue");
Summation(i = 1, N Items(counts),
Line(Eval List({sum, refs[i]}), Eval List({sum += counts[i], refs[i]}));
);
)
)
));
);Ri: Come aggiungere linee orizzontali dinamiche con un asse y condiviso in un grafico di variabilità con asse x raggruppato con valori ripetuti di N diversi?Un'opzione abbastanza semplice è creare una nuova colonna per il tuo gruppo.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cars.jmp");
// for simplicity sake we drop Passenger
rows_to_delete = dt << Get Rows Where(:"D/P"n == "Passenger");
dt << Delete Rows(rows_to_delete);
varchart = dt << Variability Chart(
Y(:Head IC),
X(:Protection, :Make, :Model),
Analysis Type("Choose best analysis (EMS REML Bayesian)"),
Show Range Bars(0),
Show Cell Means(0),
Std Dev Chart(0),
Points Jittered(1),
By(:"D/P"n)
);
dt << new column("Group", Character, Nominal, Formula(
:"D/P"n || :Protection || :Make // don't add model here
));
dt_summary = dt << Summary(
Group(:Group),
Max(:Wt),
N Categories(:Model),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0),
Invisible
);
weights = dt_summary[0, "Wt"];
counts = dt_summary[0, "Model"];
Close(dt_summary, no save);
fb = Report(varchart)[FrameBox(1)];
Eval(Eval Expr(
fb << Add Graphics Script(
Local({refs = Expr(weights), counts = Expr(counts), i, sum = 0},
Pen Size(2);
Pen Color("Blue");
Summation(i = 1, N Items(counts),
Line(Eval List({sum, refs[i]}), Eval List({sum += counts[i], refs[i]}));
);
)
)
));
Tieni presente che questo esempio ha un solo framebox poiché l'altro D/P viene eliminato