[Générateur de graphiques] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesChers tous,
J'utilise actuellement JMP16 pour créer un graphique.
J'ai une colonne contenant une image, et je souhaite épingler l'image pour chaque point sélectionné ; j'active donc l'option « ajouter une étiquette » de cette colonne.
Mais je constate que je ne peux l'épingler qu'en survolant le point avec mon curseur, en attendant que l'étiquette s'affiche, puis en cliquant sur le bouton épingler pour l'épingler un par un.
Existe-t-il une méthode plus rapide, comme du code JSL, pour y parvenir ? Je dois afficher des images sur des millions de lignes.
merci!
Automatisation et scriptageRe: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesFaut-il absolument une étiquette au survol de la souris ? Ou pourriez-vous utiliser l’image comme symbole dans votre graphique ? Par exemple, en utilisant le jeu de données d’exemple « Big Class Families » :

Si vous souhaitez uniquement des images pour les lignes sélectionnées, vous pouvez les sélectionner et nommer la sélection dans une colonne, puis utiliser cette colonne pour créer une colonne de transformation, comme ceci :
// 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 ) )
)
);
J'ai inclus le script pour que vous puissiez voir les résultats en un clic, mais tout cela peut être réalisé directement dans Graph Builder, sans aucun script. Les fonctionnalités principales sont Transformer les colonnes et Définir la forme des colonnes .
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesVoici un exemple d'épinglage des étiquettes au survol. Il est intéressant de noter que la sélection est indexée à partir de zéro. Il pourrait être judicieux de modifier ce code pour gérer le cas où aucune ligne n'est sélectionnée.
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 )
)
);

Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesMerci pour votre réponse ! L’utilisation de « Définir la forme de la colonne » fonctionne très bien, mais ce serait encore mieux si les points pouvaient également être affichés. C’est assurément une approche pratique !
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnées
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 )
)}
)
)
);
);
Super ! Ça fonctionne, mais toutes mes annotations étaient figées au même endroit sans le paramètre Origine . Pour résoudre ce problème, j'ai récupéré les valeurs des axes x et y et je les ai assignées à l' origine . Si cela fonctionne parfaitement avec les axes numériques, l'application plante lorsqu'on transmet des valeurs de type caractère . Existe-t-il une solution pour les colonnes de caractères ? Merci !
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesPour les colonnes nominales/ordinales, l'axe commence à 0 et chaque valeur l'incrémente de 1. Vous pouvez le vérifier dans les paramètres de l'axe.

Vous pouvez écrire une logique qui gère cela en fonction du tableau de données ou, si vous avez un graphique à points, vous pouvez obtenir les valeurs à partir des marqueurs.
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);
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesMerci ! Il semble que la fonction renvoie toutes les valeurs X/Y, mais comment puis-je récupérer les coordonnées X/Y des lignes sélectionnées ? J’ai essayé le code ci-dessous, mais les coordonnées X/Y renvoyées ne correspondent pas à ma sélection.
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);
);
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesPour moi, cela semble renvoyer des valeurs correctes
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};
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesAh, je comprends le problème maintenant : masquer ou exclure des lignes provoque une incohérence d’index pour les données restantes.
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 )
)
);
En utilisant ce code, lorsque la ligne 17 est masquée/exclue, les annotations des lignes 20/30 se déplaceront vers les mauvaises positions.
Existe-t-il un moyen d'empêcher cela ? Je veux dire, il y a certainement des points de données à exclure…
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesÇa marche, merci les gars !
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);
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesJe supprimerais déjà les lignes exclues de selrows.
selrows = dt << Get Rows Where(Selected() & !Excluded())
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesMauvaise nouvelle : si le générateur de graphiques utilise un filtre de données local, l’index ne correspond pas.
Existe-t-il un moyen de gérer les graphiques avec un filtre local actif ?
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesVous pouvez obtenir les lignes que le filtre de données local affichera en envoyant un message.
<< Get Filtered Rows;
au filtre de données local
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesMerci pour votre aide ! J'y suis presque !
Au fait, existe-t-il un moyen de supprimer par lots les annotations ajoutées par les scripts ?
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesSi vous pouvez obtenir les références de tous ces éléments, vous pourriez ajouter un message de fermeture ou de suppression à la liste pour les supprimer tous en même temps. Vous pourriez également utiliser une valeur d'invalidation avant la suppression et une fenêtre de mise à jour après.
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesMon code est conçu pour un générateur de graphes existant obtenu par gb = (Current Report() << Find( "Graph Builder" )) << Get Scriptable Object ;
J'ai ensuite créé une boucle Eval à la manière de mmarchandFSLR :
Il semble que je puisse uniquement accéder au gb lui-même, mais je ne trouve aucun moyen de définir la liste d'annotations « Ajouter une épingle » à partir du code ci-dessous :
Existe-t-il un moyen de lire l'identifiant unique ou quelque chose de similaire pour chaque élément et de lui attribuer ensuite la fonction << supprimer ?
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 ),
)
)
);
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesNames 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;
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesAh, je comprends le problème maintenant : masquer ou exclure des lignes provoque une incohérence d’index pour les données restantes.
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 )
)
);
En utilisant ce code, lorsque la ligne 17 est masquée/exclue, les annotations des lignes 20/30 se déplaceront vers les mauvaises positions.
Existe-t-il un moyen d'empêcher cela ? Je veux dire, il y a certainement des points de données à exclure.
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesMerci jthi ! J'apprécie vraiment !
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnées@jthi Désolé, mais existe-t-il un exemple de méthode, comme le rapport actuel / le tableau de données actuel, pour obtenir le cadre actuel sélectionné par l'utilisateur ?
Je l'utilise, mais uniquement si le script a été ajouté au graphique.
For Each( {f, n}, frames,
Eval( Eval Expr( f << AddGraphicsScript( Handle( ::currentFrame = Expr( f ) ) ) ) )
);
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesVous pouvez utiliser XPath pour rechercher l'attribut sélectionné (avec la valeur vraie).
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']");
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesMerci ! J'ai besoin de sélectionner le cadre sous le curseur (au survol ou au clic). J'ai pensé à utiliser S + clic, mais existe-t-il une méthode plus simple ?
Re: [Graph builder] Épingler par lots l'étiquette de survol pour les lignes sélectionnéesDans JMP, ces opérations sont bien plus complexes car l'accès à la position du curseur est difficile (dans la plupart des cas). Même en y parvenant, il faudrait encore déterminer quelle image correspond aux coordonnées. Il est possible de détecter le clic, mais il faut d'abord ajouter un script graphique à chaque image (les scripts graphiques s'activent au clic, au survol, au maintien et au glissement, etc.). Selon la fonction du script, d'autres options sont envisageables : par exemple, proposer à l'utilisateur une liste d'images, lui permettre de choisir celles auxquelles ajouter le script graphique, puis l'inviter à valider.