Aggiorna la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella di datiSto cercando di aggiungere linee di riferimento di colonna basate sui dati di un'altra capacità di dati. Un esempio, utilizzando "Big Class" aggiornerebbe le colonne "peso" e "altezza" con i valori P50 e P95 da una tabella di dati di ricerca.
Le righe nella tabella dei dati di ricerca corrispondono ai nomi delle colonne nella tabella principale. Le righe di riferimento dovrebbero assegnare il valore dell'etichetta dal nome della colonna della tabella di ricerca "P50" o "P95" e il valore proviene dalla riga in quella colonna.
Esempio che mostra le linee di riferimento dell'asse della colonna aggiunte:

Esempio per la tabella dei dati di ricerca:

Non sono molto esperto in JSL, quindi apprezzo qualsiasi aiuto che mi viene incontro su questo argomento. Ho creato uno script ma non sta facendo quello che voglio.
Sembra corrompere la colonna, a volte quando si traccia una distribuzione mostra tutti i valori "0". Inoltre, se sto cercando di aggiungere entrambe le linee di riferimento P50 e P95, solo l'ultima viene salvata nella colonna e la salva su entrambe le colonne.
dt = Open ("C:\Program Files\SAS\JMP\15\Samples\Data\big class.jmp");
dtLookup = New Table( "Lookup Table",
Add Rows( 2 ),
New Column( "Column Name",
Character,
Nominal,
Set Values( {"weight", "height"} )
),
New Column( "P50",
"Continuous",
Set Values( [100, 61] )
),
New Column( "P95",
"Continuous",
Set Values( [120, 70] )
)
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
numRowsLookup = N Rows( dtLookup );
numColsLookup = N Cols( dtLookup );
for(n=1,n<=numRowsLookup,n++,
col_name = dtLookup[n,1];
If(contains(col_name_list,col_name),
for(j=2,j<=numColsLookup,j++,
col = Column(dt, col_name);
col_name_Lookup = col_name_list_lookup[j];
value = Column(dtLookup,col_name_Lookup)[n];
col <<
Set Property("Axis",
{
//Add Ref Line( 63, "Dashed", "Orange", "P50", 2 )
Add Ref Line( value, "Dashed", "Orange", col_name_Lookup, 2 )
});
);
);
);
Grazie,
Ruggero
Automazione e scriptingMiscelazione e pulizia dei datiPersonalizzazione di massaOggetto: aggiornare la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella di datiUltimo aggiornamento qui. Un ringraziamento speciale a Jarmo.
Sono stato in grado di farlo funzionare come previsto. Codice finale qui per riferimento futuro.
Names Default To Here(1);
namespace("here")<<REMOVE></REMOVE> New Column("P99", "Continuous", Set Values([125, 75]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Analysis Columns"n; //Ref column name
new_properties = {}; // re-init
old_properties = {}; // re-init
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//Add Multiple Ref Lines
For( i = 2, i <= N Items( col_name_list_lookup ), i++,
new_properties_temp =
EvalExpr({
Add Ref Line(Expr(as column(dtLookup,col_name_list_lookup[i])), "Dashed", Expr(Color To RGB( 67 )),Expr(char(col_name_list_lookup[i])), 1)
});
new_properties = Insert(new_properties, new_properties_temp);
);
//end Add Multiple
//Add Specified Reference Lines
//new_properties = EvalExpr({
// Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
// Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
//});
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
//show(prop_to_add); // for debug
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Applies the new axis settings.
);
);
Oggetto: aggiornare la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella di datiCiao Jarmo,
Apprezzo l'aiuto su questo. Sfortunatamente non vedevo le vecchie e nuove proprietà dell'asse che venivano aggiornate qui. Ho visto che l'elenco "prop_to_add" viene aggiunto con proprietà vecchie e nuove, ma quando controllo le impostazioni effettive dell'asse, vedo solo le due nuove proprietà.
Dopo aver rimosso le parentesi graffe dalle proprietà impostate, è stato in grado di funzionare come previsto!
Ora ho solo bisogno di lavorare per far funzionare questo numero N di colonne di ricerca.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
//stop();
For Each Row(dtLookup,
//stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
//stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
//stop();
//Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)}))); // Didn't work with the braces.
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Worked when removing the braces.
);
);Oggetto: aggiornare la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella di datiPotresti provare a eseguire il debug del codice in parti. Puoi "eseguire" For Each Row con riga per riga utilizzando Row() = numero di riga invece del ciclo.
//For Each Row(dtLookup,
Row() = 1;
col_name =:"Column Name"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);
E poi inizia a eseguire il codice riga per riga:
old_properties = Column(dt, col_name) << get property("Axis");
//Empty()
Alcuni punti di interruzione per il debug (non utilizzo Debugger, ma molto probabilmente sarebbe ancora più semplice con esso):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
stop();
For Each Row(dtLookup,
stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
stop();
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)})));
);
);
Indice di scripting per l'inserimento:

Alcuni collegamenti per assistere con lo scripting:
Riferimento alla sintassi JSL
Guida alla sceneggiatura
Guida di JMP 16
Oggetto: aggiornare la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella di datiCosa ci fa qui la funzione Insert()? Non riesco a farlo funzionare.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Column Names"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);Oggetto: aggiornare la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella di datiNon ne sono sicuro al 100%, ma forse potresti prima ottenere le vecchie proprietà Axis con << Get Propery("Axis") e poi aggiungerle.
Forse qualcosa del genere (potrebbero esserci anche modi più semplici):
old_properties = Column(dt, "height") << get property("Axis");
old_with_new = Insert(old_properties, Expr(Add Ref Line(1, "Dashed", "Orange", "P45", 2)));
Eval(EvalExpr(column(dt, "height") << Set Property("Axis",{expr(old_with_new)})));Oggetto: aggiornare la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella di datiGrazie Jarmo. Questa soluzione è molto più semplice ma sembra sovrascrivere qualsiasi linea di riferimento dell'asse esistente. Sai se c'è un modo per preservare eventuali Axis Ref Lines che sono già presenti in quella colonna?
Oggetto: aggiornare la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella di datiEcco uno script di esempio. La mia ipotesi è che Axis venga sovrascritto se provi a farlo più volte in questo modo, quindi potresti doverli aggiungere nella stessa << Set Property (più modi diversi di costruire l'espressione per farlo).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
For Each Row(dtLookup,
col_name =:"Column Name"n;
//because we know we have only two lines to add and they are always added
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis", {
Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
}))
);
);

Non so se Eval(EvalEspr()) è necessario qui ma non farà male.
Re: Aggiorna la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella datiÈ molto utile usare uno script JSL per importare i dati direttamente in Axis. È possibile aggiungere le impostazioni dell'etichetta qui sotto nello script JSL sopra?
Ho provato ad aggiungere/modificare il tuo codice con impostazioni aggiuntive, ma ho ricevuto un errore.
Per( i = 2, i <= N Elementi( col_name_list_lookup ), i++,
nuove_proprietà_temp =
EvalExpr({
Aggiungi Ref Line(Expr(as column(dtLookup,col_name_list_lookup[i])), "Tratteggiato", Expr(Colore in RGB( 0 )),Expr(char(col_name_list_lookup[i])), 1,
Posizione etichetta ("Inline interna"), Asse opposto(1))
)
});
nuove_proprietà = Inserisci(nuove_proprietà, nuove_proprietà_temp);
);

Re: Aggiorna la linea di riferimento dell'asse della colonna in base ai dati di un'altra tabella datiAssicurati che tutte le tue staffe siano nella posizione corretta
Scopri di più...
For(i = 2, i <= N Items(col_name_list_lookup), i++,
new_properties_temp = Eval Expr(
{Add Ref Line(
Expr(As Column(dtLookup, col_name_list_lookup[i])),
"Dashed",
Expr(Color To RGB(0)),
Expr(Char(col_name_list_lookup[i])),
1,
Label Position("Inside Inline"),
Opposite Axis(1)
)}
);
new_properties = Insert(new_properties, new_properties_temp);
);