Graph Builder : masquer les catégories X sans donnéesBonjour à tous,
J'ai un tableau avec une colonne de regroupement et plusieurs variables de réponse.
New Table( "Test",
Add Rows( 7 ),
New Column( "GROUP",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "f", "g"} )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, ., 6, ., 4, ., 2] )
),
New Column( "Y 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, 6, 2, 3, ., ., .] ),
Set Display Width( 49 )
)
)Je voudrais créer un graphique à barres avec un sélecteur de colonnes.
Graph Builder(
Size( 527, 448 ),
Show Control Panel( 0 ),
Variables(
X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ),
Y( :Y )
),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} )
)Mon problème est que je ne souhaite pas afficher les niveaux sans données. En d’autres termes, je ne veux pas voir les niveaux « b », « d » et « f » pour Y et les niveaux « e », « f », « g » pour Y2.

J'ai essayé d'utiliser une clause "where" mais malheureusement elle n'est pas prise en compte par le Column Switcher.
Avez-vous une idée de la façon dont nous pourrions procéder?
Merci d'avance!
Re : Graph Builder : masquer les catégories X sans donnéesSalut @geoffrey_mann ,
Merci pour votre implication et les informations complémentaires.
Je vais commencer à faire la promotion de cette fonctionnalité auprès de mes collègues pour obtenir des votes ! 
Concernant le script, je préfère ne pas affecter la table courante donc je pense que le filtre de données local est une bonne option ! J'explorerai cette possibilité plus en profondeur.
Re : Graph Builder : masquer les catégories X sans donnéesSalut @anne_sa
Je suis tellement contente que cela ait aidé. C'est quelque chose que je voulais faire depuis un moment et vous m'avez donné la motivation. 
Aussi, je suis d'accord avec toi et @vince_faller qu'un écouteur ou un moyen de personnaliser le comportement autour du sélecteur de colonnes serait généralement utile à ceux qui programment leurs propres compléments ou modifient le comportement. Nous faisons cela tout le temps dans JMP Clinical et JMP Genomics, c'est pourquoi j'ai attribué le mérite à @kelci_miclaus et @drewfoglia pour le code que j'ai emprunté.
Si seulement nous connaissions un chef de produit JMP qui pourrait nous aider à réaliser cet objectif.
S'il vous plaît, votez tous les deux pour la fonctionnalité et cela aidera à la justification.
En ce qui concerne les modifications finales, vous devriez avoir le contrôle sur le code wrapper que vous avez écrit. Les appels API visent simplement à remplacer les variables X et Y. Je continuerai à ajouter ces fonctions pour aider les programmeurs à simplifier l'encapsulation de GraphBuilder afin qu'ils puissent créer des compléments plus rapidement. Ce que j'essaie de dire ici, c'est simplement d'ajouter des fonctions pour mettre à jour GraphBuilder dans le fichier API afin que tout fichier "pilote" que vous utilisez ait le comportement de sélection. Notez que j'aurais pu mettre le dt << clearrowstates(); appelez ci-dessous les appels ReplaceGB... pour organiser le changement d'état des lignes vers la table en un seul endroit. Notez également que ce code modifie les états des lignes de la table de données principale au lieu d'utiliser un filtre local pour modifier le rapport GraphBuilder. Vous souhaiterez peut-être modifier votre approche si vous souhaitez plusieurs rapports du tableau de données. Mais ce ne sont que des notes et sont destinées à servir d’informations supplémentaires pour les futures applications que vous pourrez créer avec JMP.
Notez les états clearrow dans votre fichier de pilote :
dt << clearrowstates();
newvarname = lb<<GETSELECTED></GETSELECTED>
Sur la base de ma compréhension "simpliste" de ce que vous essayez de faire, je vous recommande simplement de remplacer dt << clearrowstates(); avec dt << désexclure (); Faites-moi savoir si c'est le comportement que vous préférez ou s'il est plus complexe que cela.
Re : Graph Builder : masquer les catégories X sans donnéesJe suis totalement d'accord avec vous @vince_faller , ce serait une fonctionnalité très intéressante 
Je pense que je vais l'ajouter à la liste de souhaits JMP !
Re : Graph Builder : masquer les catégories X sans donnéesMerci beaucoup pour ces scripts @geoffrey_mann
C'est définitivement plus propre que ce que j'ai fait !
Il y a juste une chose que j'aimerais adapter : chaque fois que nous sélectionnons une nouvelle variable dans la list box, l'état des lignes est réinitialisé. Ainsi si certains points ont été étiquetés / exclus / colorés... on perdra cette information et cela peut être gênant.
Sinon ça correspond à mes attentes donc merci encore !
Re : Graph Builder : masquer les catégories X sans donnéesCe serait cool si le commutateur de colonne avait un message <Re : Graph Builder : masquer les catégories X sans données
Re-bonjour @anne_sa ,
Désolé pour le retard, j'ai effectivement attrapé la grippe pendant quelques jours et j'ai pris un peu de retard.
J'ai joint deux fichiers. Le premier fichier jsl (Exemple de script pour changer les états de ligne.jsl) est le fichier du pilote et le chemin de la deuxième ligne est le chemin complet de l'emplacement où vous placez le deuxième fichier (GraphBuilderJSLAPI.jsl).
//Include script to modify GraphBuilder with some special functions defined
include(ConvertFilePath("/Users/gemann/Projects/Prototypes/JSLClasses/GraphBuilderJSLAPI.jsl", absolute, windows));
//Create a sample table
dt = New Table( "Test",
Add Rows( 7 ),
New Column( "GROUP",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "f", "g"} )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, ., 6, ., 4, ., 2] )
),
New Column( "Y 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, 6, 2, 3, ., ., .] ),
Set Display Width( 49 )
)
);
//Add a new window and build a listbox beside a graphbuilder
New Window( "CustomColumnSwitcher Window",
//Start by getting all of the columns in the current datatable
CNames = dt << Get Column Names( Numeric );
Show( CNames );
//User a horizontal layout
HListBox(
//Use a ListBox as the new Column Switcher
lb = List Box(
CNames,
maxSelected(1),
//The next lines specify the script that gets run when an item in listbox is selected
dt << clearrowstates();
newvarname = lb<<GETSELECTED></GETSELECTED>
Bonne chance et faites-moi savoir si vous avez des problèmes. Bien entendu ces fichiers ne sont pas entièrement testés !!! 
Re : Graph Builder : masquer les catégories X sans donnéesSalut @geoffrey_mann ,
J'ai écrit quelque chose pour mettre à jour le sélecteur de colonnes et modifier le réglage de l'axe (comme suggéré par @julien ) chaque fois que nous sélectionnons une nouvelle variable. Cependant, cela n'est peut-être pas très efficace, alors bien sûr, votre solution m'intéresse beaucoup !
Re : Graph Builder : masquer les catégories X sans donnéesBonjour Anne,
Je voulais revenir avec vous pour voir si vous avez trouvé une solution de codage à votre problème. Il m'a fallu du temps pour trouver le temps mais j'ai une solution de codage si vous en avez encore besoin.
Re : Graph Builder : masquer les catégories X sans donnéesSalut @julien !
J'apprécie vraiment vos efforts pour résoudre mon problème ! Malheureusement, le nombre de niveaux non manquants peut être différent d'une variable de réponse à l'autre. Cependant, votre dernier message peut certainement être utilisé pour la « solution de codage ». Changer les paramètres des axes en fonction du numéro de niveau est en effet un bon moyen d'afficher ce qui est attendu. Je vais travailler dans ce sens. Merci pour votre aide!
Re : Graph Builder : masquer les catégories X sans donnéesSalut @anne_sa ,
Je vois exactement ce que tu veux dire. Cela pourrait vraiment se résumer à coder quelque chose de personnalisé, mais permettez-moi d'essayer encore une fois de manière interactive. Y a-t-il toujours seulement quatre niveaux (quoique différents) de groupe pour chaque Y ? Si tel est le cas, voici un hack potentiel : Graph Builder conservera l'axe X lors du changement de colonne, et comme vos niveaux sont classés par ordre croissant (les niveaux vides sont donc toujours à la fin), nous pourrions ajuster l'axe de sorte que seuls quatre niveaux s'affichent. . Vous pouvez le faire dans les paramètres de l'axe (clic droit sur l'axe > paramètres de l'axe), ou simplement en faisant glisser l'extrémité de l'axe jusqu'à ce que les niveaux manquants soient masqués).
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ), Y( :Y ) ),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} ),
SendToReport( Dispatch( {}, "GROUP", ScaleBox, {Min( -0.5 ), Max( 3.5 ), Inc( 1 ), Minor Ticks( 0 )} ) )
);

Peut-être une solution potentielle dans votre cas ?
@julien
Re : Graph Builder : masquer les catégories X sans donnéesMerci @julien pour cette proposition ! En effet il permet d'afficher uniquement les niveaux avec des données.
Le seul problème (mais peut-être que j'en demande trop) c'est qu'on perd le lien entre les lignes. Par exemple si je sélectionne le niveau "a" pour Y et si je veux voir la valeur correspondante pour Y2, rien n'est mis en évidence lorsque je sélectionne Y2 avec le filtre de données local.
Peut-être que coder le comportement attendu est la solution...
Re : Graph Builder : masquer les catégories X sans donnéesSalut @anne_sa ,
Comme vous l'avez découvert, Graph Builder observe ces catégories de votre variable de regroupement et insistera vraiment pour les tracer (ce qui est généralement une bonne chose) car il suppose que vous y trouvez de la valeur puisque vous les avez conservées dans votre table. Dans votre cas avec le sélecteur de colonnes, ce n'est pas aussi simple que de simplement supprimer ces lignes puisque pour vos autres colonnes, les données existent. Une solution consiste à restructurer vos données afin que les lignes manquantes puissent être éliminées. Je ferais cela en empilant :
Tables > Pile
Data Table( "Test" ) << Stack(
columns( :Y, :Y 2 ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" )
);
Cela renverra un tableau comme ci-dessous :

Supprimez les valeurs manquantes en cliquant avec le bouton droit sur l'une des cellules manquantes > sélectionnez la correspondance. Ensuite, supprimez ces lignes. Cela renvoie le tableau ci-joint. Maintenant, créez votre graphique mais utilisez un filtre de données local plutôt qu'un sélecteur de colonnes pour sélectionner ce qui était auparavant une réponse de votre colonne d'étiquette :
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :GROUP ), Y( :Data ) ),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Local Data Filter(
Add Filter(
columns( :Label ),
Where( :Label == "Y" ),
Display( :Label, Size( 160, 17 ) )
)
)
);

Puisqu'il n'y a aucune ligne manquante, Graph Builder affiche uniquement les niveaux de groupe contenant des données.Vous pouvez, bien sûr, généraliser cela à n’importe quel nombre de niveaux de Y – il suffit de les empiler tous lors de l’étape initiale.
J'espère que ça aide!
@julien
Re : Graph Builder : masquer les catégories X sans donnéesBonjour Anne,
Je vois votre problème maintenant et je suis toujours en train d'y jeter un œil. Je pense que celui-ci prendra un peu de codage.Re : Graph Builder : masquer les catégories X sans donnéesMerci pour votre réponse @geoffrey_mann
Malheureusement, ce n'est pas exactement ce que j'aimerais obtenir, car lorsque je sélectionne une nouvelle colonne avec le sélecteur de colonnes, le filtre de données local est toujours basé sur Y.
Bien sûr, il est possible de modifier manuellement le filtre de données local mais comme je peux avoir un nombre assez élevé de variables, ce serait bien d'avoir un moyen automatique de le faire 
Re : Graph Builder : masquer les catégories X sans donnéesBonjour Anne,
Votre idée selon laquelle vous avez besoin d’une clause « où » ou plutôt d’un filtre quelconque est correcte. Essayez d'ajouter la ligne suivante à votre script graphbuilder :
Local Data Filter( Add Filter( columns( :Y ), Where( :Y >= 2 & :Y <= 7 ) ) )
J'espère qu'un filtre de données local convient ?
Graph Builder(
Size( 527, 448 ),
Show Control Panel( 0 ),
Variables(
X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ),
Y( :Y )
),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} ),
Local Data Filter( Add Filter( columns( :Y ), Where( :Y >= 2 & :Y <= 7 ) ) )
);
Re : Générateur de graphiques : masquer les catégories X sans donnéesIl s'agit d'un message ancien, mais il pourrait tout de même apporter quelques informations utiles :
Vous pouvez également utiliser un filtre de données local avec sélection des valeurs manquantes et inverse pour la valeur Y respective.
Local Data Filter(
Inverse( 1 ),
Add Filter( columns( :Y1, :Y2 ), Select Missing( :Y2 ) )
),
Column Switcher( :Y2, {:Y1, :Y2, :Y3} )
Vous pourriez également ajouter un événement pour la sélection d'un autre niveau dans le sélecteur de colonnes, ce qui modifierait le filtre du sélecteur de données local pour toutes vos variables Y. C'est peut-être un peu complexe, mais ça pourrait fonctionner.
Re : Générateur de graphiques : masquer les catégories X sans donnéesSalut @martindemel ,
Merci pour votre message. Même si ce message date un peu, c'est toujours intéressant de découvrir différentes manières d'atteindre le même objectif.