[Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateCarissimi,
Attualmente utilizzo JMP16 per creare un grafico.
Ho una colonna contenente un'immagine e voglio associare l'immagine a ciascun punto selezionato, quindi attivo l'opzione "aggiungi etichetta" per questa colonna.
Ma scopro che posso solo posizionando il puntatore sul punto e aspettando che l'etichetta visualizzata al passaggio del mouse si mostri, e quindi cliccando sul pulsante della puntina per fissarla una per una,
Esiste un modo più veloce per ottenere questo risultato, ad esempio tramite codice JSL? Ho milioni di righe e devo visualizzare le immagini.
Grazie!
Automazione e scriptingOggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateDeve essere un'etichetta che appare al passaggio del mouse? Oppure si potrebbe usare l'immagine come simbolo nel grafico? Ad esempio, utilizzando il dataset di esempio Big Class Families:

Se desideri visualizzare le immagini solo nelle righe selezionate, puoi selezionarle e assegnare un nome alla selezione nella colonna, quindi utilizzare tale colonna per creare una colonna di trasformazione, in questo modo:
// Open Data Table: Big Class Families.jmp
// → Data Table( "Big Class Families" )
Open( "$SAMPLE_DATA/Big Class Families.jmp" );
// Name selection in column: Use Images
Data Table( "Big Class Families" ) << Clear Select <<
Select Rows( [1, 6, 14, 15, 16] ) <<
Name Selection in Column( Column Name( "Use Images" ), Selected( 1 ) );
Graph Builder(
Transform Column( "Transform[height]", Formula( :height * :Use Images ) ),
Size( 648, 551 ),
Show Control Panel( 0 ),
Variables(
X( :weight ),
Y( :height ),
Y( :"Transform[height]"n, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ),
Points( X, Y( 2 ), Legend( 5 ), Set Shape Column( :picture ) )
)
);
Ho incluso lo script in modo che possiate vedere i risultati con un solo clic, ma tutto ciò può essere fatto all'interno di Graph Builder senza bisogno di script. Le funzionalità principali sono Trasforma colonne e Imposta forma colonna .
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateEcco un esempio di come fissare le etichette al passaggio del mouse. È interessante notare che la selezione utilizza un indice a base zero. Potrebbe essere opportuno modificarlo per gestire il caso in cui non sia selezionata alcuna riga.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt << Select Rows( [1 5 7] );
pin_expr = {};
For Each( {v, i}, dt << Get Selected Rows,
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr(
dt << Graph Builder(
Size( 658, 556 ),
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport( Dispatch( {}, "Graph Builder", FrameBox, __pin_expr__ ) )
)
),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);

Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateGrazie per la risposta! Usare "Imposta colonna forma" funziona benissimo, ma sarebbe ancora meglio se si potessero visualizzare anche i punti. Questo è sicuramente un approccio pratico!
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionate
For Each( {v, i}, row_selection,
local_x = Column( dt, col_x )[v];
local_y = Column( dt, col_y )[v];
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Origin( {Expr( local_x ), Expr( local_y )} ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) ),
Offset( {-50, -45} ),
Replace Text( " " ),
Filled( 0 ),
Tag Line( 1 )
)}
)
)
);
);
Ottimo! Funziona, ma senza l'impostazione Origine tutte le mie annotazioni erano ancorate esattamente nella stessa posizione. Per risolvere il problema, ho letto i valori degli assi x/y e li ho assegnati all'Origine . Sebbene questo funzioni perfettamente con gli assi numerici, il passaggio di valori di colonna di tipo carattere causa il crash dell'applicazione. Esiste una soluzione alternativa per le colonne di tipo carattere? Grazie!
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionatePer le colonne nominali/ordinali, l'asse parte da 0 e ogni valore lo incrementa di 1. È possibile verificarlo nelle impostazioni dell'asse.

È possibile scrivere una logica che si occupi di questo in base alla tabella dei dati oppure, se si dispone di un grafico a punti, è possibile ottenere i valori dai marcatori.
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
ms = report(gb)[framebox(1)] << find seg(markerseg(1));
Show(ms << Get X Values, ms << Get Y Values);
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateGrazie! Sembra che restituisca tutti i valori X/Y, ma come posso leggere i valori X/Y delle righe selezionate? Ho provato il codice qui sotto, ma i valori X/Y restituiti non corrispondono a quelli che ho selezionato.
r = dt << Get Selected Rows();
ms = Report(gb)[framebox(1)] << Find Seg( Marker Seg( 1 ) );
For Each( {v, i}, r,
t = ms << Get Point( v );
x = t[1];
y = t[2];
show(x,y);
);
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateA me sembra che questo restituisca valori corretti
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
For Each({currow}, selrows,
coord = ms << Get Point(currow);
Show(coord);
);

coord = {0, 59};
coord = {1, 61};
coord = {1, 65};
coord = {1, 63};
coord = {2, 61};
coord = {2, 62};
coord = {3, 67};
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateAh, ora capisco il problema: nascondere o escludere le righe causa una mancata corrispondenza dell'indice per i dati rimanenti.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
pin_expr = {};
For Each({v}, selrows,
coord = ms << Get Point(v);
Show(coord);
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index Row( Expr( v - 1 ) ),
Origin( Expr(coord)),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr( Report(gb)[framebox(1)] << __pin_expr__ ),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);
Utilizzando questo codice, quando la riga 17 viene nascosta/esclusa, le annotazioni delle righe 20/30 si sposteranno in posizioni errate.
C'è un modo per evitare che ciò accada? Voglio dire, sicuramente ho dei punti dati da escludere...
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateFunziona, grazie ragazzi!
ex = dt << Get Excluded Rows;
pin_expr = {};
For Each( {v}, dt << Get Selected Rows,
offset = N Rows(Loc(ex < v));
coord = ms << Get Point(v - offset);
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateEliminerei le righe già escluse da selrows
selrows = dt << Get Rows Where(Selected() & !Excluded())
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateBrutte notizie: se il generatore di grafici ha un filtro dati locale, l'indice non corrisponde.
Esiste un modo per gestire i grafici con il filtro locale attivo?
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateÈ possibile ottenere le righe che il filtro dati locale mostrerà inviando un messaggio
<< Get Filtered Rows;
al filtro dati locale
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateGrazie per l'aiuto! Ci sono quasi!
A proposito, esiste un modo per rimuovere in blocco le annotazioni aggiunte dagli script?
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateSe riesci a ottenere i riferimenti a tutti questi elementi, penso che potresti impostare << Messaggio di chiusura o << Messaggio di eliminazione sull'elenco per rimuoverli tutti contemporaneamente. Potresti anche voler utilizzare << Invalid prima dell'eliminazione e << Aggiorna finestra dopo.
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateIl mio codice è progettato per un generatore di grafici esistente ottenuto tramite gb = (Current Report() << Find( "Graph Builder" )) << Get Scriptable Object;
quindi ho creato un ciclo Eval come suggerito da mmarchandFSLR:
Sembra che io possa accedere solo al GB stesso, ma non c'è modo di definire l'elenco "Aggiungi annotazione pin" dal codice seguente:
Esiste un modo per leggere l'ID univoco o qualcosa di simile di ciascuno e assegnargli << delete?
pin_expr = {};
For Each( {v, i}, dt << Get Selected Rows,
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
.....
If( N Items( pin_expr ) > 0,
Eval(
Substitute(
Expr(
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
),
Expr( __pin_expr__ ), Name Expr( pin_expr ),
)
)
);
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateNames Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt << select rows([1, 10, 21, 30, 40]);
gb = dt << Graph Builder(
Size(658, 556),
Show Control Panel(0),
Variables(X(:age), Y(:height)),
Elements(Points(X, Y, Legend(3)))
);
pins = {};
gb << inval;
frame = Report(gb)[FrameBox(1)];
For Each({currow}, dt << Get Selected Rows,
Eval(EvalExpr(
Insert Into(pins, frame << Add Pin Annotation(
Seg(Marker Seg(1)),
Index(Expr(currow - 1)),
Index Row(Expr(currow - 1)),
UniqueID(Expr(currow - 1))
));
));
);
gb << update window;
wait(1); // demo purposes
pins << Delete;
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateAh, ora capisco il problema: nascondere o escludere le righe causa una mancata corrispondenza dell'indice per i dati rimanenti.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
pin_expr = {};
For Each({v}, selrows,
coord = ms << Get Point(v);
Show(coord);
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index Row( Expr( v - 1 ) ),
Origin( Expr(coord)),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr( Report(gb)[framebox(1)] << __pin_expr__ ),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);
Utilizzando questo codice, quando la riga 17 viene nascosta/esclusa, le annotazioni delle righe 20/30 si sposteranno in posizioni errate.
C'è un modo per impedire che ciò accada? Voglio dire, sicuramente ho dei punti dati da escludere.
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateGrazie jthi! Lo apprezzo davvero!
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionate@jthi Scusa, ma esiste un modo, ad esempio tramite il report corrente o la tabella dati corrente, per ottenere il frame attualmente selezionato dall'utente?
Lo uso, ma solo se al grafico è già stato aggiunto lo script.
For Each( {f, n}, frames,
Eval( Eval Expr( f << AddGraphicsScript( Handle( ::currentFrame = Expr( f ) ) ) ) )
);
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateÈ possibile utilizzare XPath per cercare l'attributo selezionato (con valore true)
Names Default To Here(1);
//This message applies to all display box objects
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Run Script("Bivariate");
Report(biv)[FrameBox(1)] << Select(1);
report(biv) << XPath("//FrameBox[@selected='true']");
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateGrazie! In realtà ho bisogno di selezionare la cornice sotto il cursore del mouse (sia quando ci si passa sopra con il mouse, sia quando si clicca). Avevo pensato di usare S + clic per la selezione, ma c'è un modo più semplice per farlo?
Oggetto: Re: [Generatore di grafici] Blocca in blocco l'etichetta al passaggio del mouse per le righe selezionateEseguire queste operazioni è molto più difficile in JMP, poiché non è facile accedere alla posizione del cursore (nella maggior parte dei casi) e, anche se fosse possibile, bisognerebbe comunque calcolare quale frame si trova sotto le coordinate. È possibile ottenere il clic, ma prima è necessario aggiungere uno script grafico a ciascuna delle caselle del frame (gli script grafici si attivano con il clic del mouse, passando il mouse sopra i punti, tenendo premuto e trascinando, ecc.). A seconda di cosa deve fare lo script, potrebbero esserci altre opzioni, ad esempio si potrebbe fornire all'utente un elenco di caselle del frame, consentirgli di selezionare a quali aggiungere lo script grafico e quindi chiedere all'utente di premere OK.