Mettez en surbrillance les compartiments d'une distribution en fonction d'une valeur de colonne pour mettre en évidence la migration des compartimentsJ'ai un ensemble de distributions qui contiennent une population d'unités. J'ai utilisé un select where avec un appel containsitem pour sélectionner les éléments de liste dans mon ensemble de données correspondant à des numéros d'identification de référence DUT spécifiques. Cela permet d'afficher les bacs contenant les mesures des unités d'intérêt. Je voudrais utiliser la date du test pour chaque instance de la sélection pour mettre en évidence le bac contenant les mesures. Par exemple, si la même unité a été testée le 20/06/2024 et testée à nouveau ultérieurement le 25/06/2024, puis une fois de plus le 28/06/2024. Le résultat du bac du 20/06 serait mis en évidence avec une couleur et le résultat du bac du 25/06, le 28/06 aurait deux autres couleurs. Certains autres objectifs sont que ces couleurs soient cohérentes dans toutes les distributions du rapport (une couleur pour chaque date de test), toutes les unités non sélectionnées restant avec la couleur par défaut. Je voudrais également que la surbrillance soit de haut en bas du tracé pour le bac respectif.
Votre soutien est grandement apprécié.
//dtmain << select where(:SN=="12346777" | :SN=="12346982");
dtmain << select where(ContainsItem(:SN, {"12346777", "12346982"}));
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :Average ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
Continuous Distribution(
Column( :Min ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
Continuous Distribution(
Column( :Max ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
By(
:TID, :BLOCKNAME, :MEAS_TYPE
)
);

Maquette de ce que je voudrais réaliser :

Analyse et modélisation de données de baseAnalyse de fiabilitéRé : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsPourriez-vous choisir un fichier approprié dans le dossier d’exemples et créer une maquette illustrant le problème ?
Les avantages :
- fait gagner du temps (#1) :
aucun utilisateur n'a besoin de créer un jeu de données de maquette - fait gagner du temps (#2) :
aide à comprendre le problème - toutes les réponses seront basées sur une maquette commune
-> facile à comparer

par exemple avec des données de température, une sélection d'état et des couleurs par trimestre - au lieu des données d'origine, la sélection DUT et les couleurs par dates de mesure - est-ce ce qui vous intéresse ?
dt = Open( "$SAMPLE_DATA/Functional Data/Weekly Weather Data.jmp" );
dt << New Column( "selected Quarter",
"Ordinal",
Formula( If( Selected(), Quarter( :DATE ) ) ),
Set Property(
"Value Colors",
{1 = -13912408, 2 = -4042310, 3 = -4354269, 4 = -13400361}
)
);
dt << Graph Builder(
Transform Column( "temperature", Formula( Round( :TAVG / 2 ) * 2 ) ),
Size( 568, 328 ),
Show Control Panel( 0 ),
Variables( X( :STATION ), X( :temperature ), Overlay( :selected Quarter ) ),
Elements( Position( 1, 1 ), Bar( X, Overlay( 0 ), Legend( 9 ), Bar Style( "Stacked" ) ) ),
Elements( Position( 2, 1 ), Bar( X, Legend( 1 ), Bar Style( "Stacked" ) ) ),
SendToReport(
Dispatch( {}, "400", ScaleBox,
{Legend Model( 1, Properties( 0, {Fill Color( 32 )}, Item ID( "Missing", 1 ) ) )}
),
Dispatch( {}, "Graph Builder", FrameBox( 2 ), {Fill Selection Mode( "Unselected Faded" )} )
)
);
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsVous pouvez peut-être le faire avec des lignes de référence
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Set Bin Width(2),
Process Capability(0)
)
);
ab = Report(dist)[AxisBox(1)];
ab << Add Ref Line({60, 62}, "Solid", "Red", "", 1, 0.25);
ab << Add Ref Line({62, 64}, "Solid", "Green", "", 1, 0.25);
ab << Add Ref Line({64, 66}, "Solid", "Blue", "", 1, 0.25);

ou en utilisant des scripts graphiques
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Set Bin Width(2),
Process Capability(0)
)
);
fb = Report(dist)[FrameBox(2)];
fb << Add Graphics Script(
1,
Transparency(0.2);
Fill Color("Red");
Rect(68, Y Range() + 10, 70, Y Origin(), 1);
Transparency(0.2);
Fill Color("Light Green");
Rect(70, Y Range() + 10, 72, Y Origin(), 1);
);

Pour obtenir la même coloration sur toutes les distributions, vous pouvez définir la propriété de couleurs de valeur pour vos dates et l'utiliser lors de la définition des couleurs, ou créer une liste de couleurs et les utiliser dans l'ordre.
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsVoici ma façon de procéder. Il recherche les lignes sélectionnées et les bacs qui leur sont associés, puis ajoute les lignes de référence selon les besoins.

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// For illustration, randomly select some rows
For( i = 1, i <= 3, i++,
dt << select rows( Random Integer( 1, N Rows( dt ) ) )
);
dist = dt << Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :height ),
Quantiles( 0 ),
Summary Statistics( 0 ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
)
);
distRPT = Report( dist )[AxisBox( 1 )];
// Find the Midpoints of the bins the selected rows are in
dist << Save( "Level Midpoints" );
theBins = (Associative Array( Column( dt, N Cols( dt ) )[dt << get selected rows] )) << get keys;
dt << delete columns( N Cols( dt ) );
// Get the Increment of the X axis
theIncr = distRPT[AxisBox( 1 )] << get inc;
// Add the reference lines for each selected bin
For Each( {bin, index}, theBins,
binList = {};
Insert Into( binList, bin - theIncr / 2 );
Insert Into( binList, bin + theIncr / 2 );
Eval( Eval Expr( distRPT << Add Ref Line( Expr( binList ), "Solid", Expr( Index + 2 ), "", 1, 0.25 ) ) );
);
Une extension de ce principe, dans lequel le graphique changerait de manière interactive lorsque l'utilisateur sélectionne et désélectionne différentes lignes, nécessiterait l'ajout d'un gestionnaire RowState et d'une logique qui supprimerait d'abord toutes les lignes de référence existantes, puis ajouterait les nouvelles.
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsUne question à laquelle il faut répondre :
comment les couleurs doivent-elles être attribuées et comment la plage doit-elle être marquée.
par exemple si 6/20 données pour les identifiants sélectionnés sont : 48, 90 ( 77, 56, ...).
Ou l'inverse : pouvons-nous être sûrs que les données de tous les identifiants d'appareils sélectionnés à une date donnée se trouvent dans le même bac ?
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsC'est noté. Merci. J'adapterai ma question pour utiliser les données disponibles comme vous l'avez suggéré.
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsMerci pour le soutien.
J'ai pu utiliser l'ajout de référence comme vous et @jthi l'avez suggéré. J'ai utilisé l'approche pour la coloration et j'ai confirmé qu'elle fonctionnera pour une seule distribution. Lorsque j'ajoute des conditions By, je perds la capacité d'adressage du tracé, ce qui entraîne des erreurs.
Comme suggéré par @hogi, je suis passé aux données disponibles pour cette question. Pour faciliter la question, j'ai augmenté Big Class dans une version modifiée du script de Jim. Voici les étapes que j'ai suivies et les résultats
1. Importer une grande classe
2. Ajoutez conditionnellement des données si la colonne « État » n'est pas dans le tableau
a. Ajoutez une colonne nommée État avec des données séquencées pour placer les personnes dans « CA », « WA » ou « OR ».
b. Ajoutez une deuxième « PATTY » qui a 16 ans, « F », 57 ans, 134 ans et qui se trouve à « WA ».
3. Sélectionnez quelques noms. J'ai choisi LESLIE et PATTY
4. Exécutez le script pour rechercher et mettre en évidence les bacs qui vous intéressent.
D'ACCORD Case - remove By (:State) from the script below and change the preceding comma to a semicolon to run successfully. The code finds both instances of Patty and uses different colors for each of them. If they had the same height, for this example the reference lines would overlap only showing one of the two colors.
@hogi a fait une bonne remarque sur l'arbitrage de la couleur affichée. Une fois que j'aurai compris l'adressage des éléments, je prévois d'ajouter une condition pour le cas où plusieurs points de données intéressants se produisent dans le même bac.

Cas NG - exécutez la distribution avec une condition By basée sur :State et voyez une erreur dans l'adressage de l'objet plot. J'ai essayé quelques permutations d'adressage sans succès. Il me manque des informations clés pour accéder à l'AxisBox.
Cela n'a pas fonctionné non plus :
distRPT = Rapport( dist )["hauteur",AxisBox( 1 )];
distRPT = Rapport( dist )["État=WA","hauteur",AxisBox( 1 )];
distRPT = Rapport( dist["État=WA"] )["hauteur",AxisBox( 1 )];
Exemple de code d'erreur : objet non inscriptible à la ligne 41 dans l'accès ou l'évaluation de « Report(dist)[ /*###*/AxisBox(1)] », Report( dist )[/*###*/AxisBox( 1 )]
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name_list = dt << get column names(string);
newColName = "State";
// New column: State
if (!contains(col_name_list, newColName),
Local( {dt, tempStrings},
dt = Data Table( "Big Class" );
dt << New Column( "State", Character, "Nominal" ) << Begin Data Update;
tempStrings = {"CA", "WA", "OR"};
For Each Row( dt, :State = tempStrings[Sequence( 1, 3, 1, 1 )] );
dt << End Data Update;
);
//Make it a double Patty :), another person with the same name.
dt << Add Rows( 1, At End );
//Cheat and use a constant of 41 for the last row index
dt[[41],{name,age,sex,height,weight,State}] = {{"PATTY", 16, "F", 57, 134, "WA"}};
);
// For illustration, select some names
dt << select where( ContainsItem(:name, {"LESLIE","PATTY"}));
dist = dt << Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :height ),
Quantiles( 0 ),
Summary Statistics( 0 ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
By (:State)
);
distRPT = Report( dist )[AxisBox( 1 )];
// Find the Midpoints of the bins the selected rows are in
dist << Save( "Level Midpoints" );
theBins = (Associative Array( Column( dt, N Cols( dt ) )[dt << get selected rows] )) << get keys;
dt << delete columns( N Cols( dt ) );
// Get the Increment of the X axis
theIncr = distRPT[AxisBox( 1 )] << get inc;
// Add the reference lines for each selected bin
For Each( {bin, index}, theBins,
binList = {};
Insert Into( binList, bin - theIncr / 2 );
Insert Into( binList, bin + theIncr / 2 );
Eval( Eval Expr( distRPT << Add Ref Line( Expr( binList ), "Solid", Expr( Index + 2 ), "", 1, 0.25 ) ) );
);
Vos commentaires et conseils sont appréciés.
Merci!
Bryan
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsbon : )
concernant "trouver la bonne boite d'axe", ce souhait dans la Wish List :
Facilitez l'obtention des résultats des rapports via JSL
a le statut "dans la file d'attente" - j'espère qu'en plus de "plus facile d'obtenir des résultats à partir des rapports", cela facilitera également la recherche de la bonne case d'axe ...
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsMa première supposition est que vous essayez d'utiliser la fonction Report() sur une liste (vérifiez ce que contient dist en utilisant Show(dist);) lorsque vous utilisez By
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsSi vous avez besoin des groupes BY, cela devient un peu plus compliqué.
Chaque sous-parcelle peut avoir des largeurs de compartiment différentes. C'est pourquoi une boucle for est nécessaire :
- pour obtenir les largeurs individuelles des bacs.
- pour obtenir les lignes sélectionnées pour la sous-parcelle spécifique
- pour ajouter les lignes de référence à la sous-intrigue spécifique.
Hm, il faudrait peut-être repenser l'idée des zones ombrées - nous avons également le problème avec les couleurs.
Pour le moment, nous appliquons simplement une couleur différente à chaque bac sélectionné . Les zones ombrées sont jolies, mais la largeur est assez arbitraire. Peut-être ajouter simplement une ligne par ID sélectionné ? Combien d'« ID » souhaitez-vous sélectionner ?
Quand ça sent le ruban adhésif, il est temps de se demander : est-ce qu'on réinvente la roue ?
En général, Graph Builder peut faire de telles choses automatiquement sans avoir besoin de communiquer avec la couche de rapport...
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_name_list = dt << get column names( string );
newColName = "State";
// New column: State
If( !Contains( col_name_list, newColName ),
Local( {dt, tempStrings},
dt = Data Table( "Big Class" );
dt << New Column( "State", Character, "Nominal" ) << Begin Data Update;
tempStrings = {"CA", "WA", "OR"};
For Each Row( dt, :State = tempStrings[Sequence( 1, 3, 1, 1 )] );
dt << End Data Update;
);
//Make it a double Patty :), another person with the same name.
dt << Add Rows( 1, At End );
//Cheat and use a constant of 41 for the last row index
dt[[41], {name, age, sex, height, weight, State}] = {{"PATTY", 16, "F", 57, 134, "WA"}};
);
// For illustration, select some names
dt << select where( Contains Item( :name, {"LESLIE", "PATTY"} ) );
dist = dt << Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :height ),
Quantiles( 0 ),
Summary Statistics( 0 ),
Horizontal Layout( 1 ),
Normal Quantile Plot( 0 ), // disable, if the user enabled it in the preferences :)
Vertical( 0 ),
Set Bin Width( 2 ),
Process Capability( 0 )
),
By( :State )
);
// get all reports
// if there is a BY group, get the info - if there is none, put it into a list
If( Is List( dist ),
dists=dist;
myBys = Transform each ({myexpr} , dist << Get Where Expr, Arg(myExpr , 2 ))
, //no By
dists = Eval List( {dist} );
myBys= {};
);
//get the reports
distRPTs = Transform Each( {dist}, dists, Report( dist ) );
// Find the Midpoints of the bins the selected rows are in
dist << Save( "Level Midpoints" );
//loop though the By groups and add the reflines
For Each( {report, idx}, distRPTs,
//report = distRPTs[2]; idx=2;
selected rows = dt << get selected rows;
// there is a BY group -> restrict the selection
if(N Items(myBys),
Eval( Eval Expr( selected rows = dt << get rows where( Contains( Expr( selected rows ), Row() ) & :State == Expr( myBys[idx] ) ) ) );
);
theBins = (Associative Array( Column( dt, N Cols( dt ) )[selected rows] )) << get keys;
// Get the Increment of the X axis
theIncr = report[AxisBox( 1 )] << get inc;
// Add the reference lines for each selected bin
For Each( {bin, index}, theBins,
//bin = 57; index=1
binList = {};
Insert Into( binList, bin - theIncr / 2 );
Insert Into( binList, bin + theIncr / 2 );
Eval( Eval Expr(report[AxisBox( 1 )] << Add Ref Line( Expr( binList ), "Solid", Expr( Index + 2 ), "", 1, 0.25 ) ) );
);
);
dt << delete columns( N Cols( dt ) );Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsvia Graph Builder :
New Column( "selected",
Character,
Formula( If( Col Maximum( Selected( Row State() ), :name ), :name, "-" ) )
)
New Window( "try",
H List Box(
Graph Builder( Size( 519, 452 ), Show Control Panel( 0 ), Show Legend( 0 ), Variables( X( :name ) ), Elements( Bar( X ) ) );
gb = Graph Builder(
Size( 487, 500 ),
Show Control Panel( 0 ),
Variables( X( :height ), Wrap( :State ), Color( :selected ) ),
Elements(
Heatmap( X, Legend( 8 ) ),
Histogram( X, Legend( 6 ), Response Scale( "Fill" ) ),
Points( X, Legend( 9 ), Jitter( "None" ) )
),
SendToReport(
Dispatch( {}, "400", ScaleBox,
{Legend Model( 8, Properties( 0, {Transparency( 0 )}, Item ID( "-", 1 ) ) ), Legend Model(
9,
Properties( 0, {Transparency( 0 )}, Item ID( "-", 1 ) )
)}
)
)
);
)
);
(gb << xpath( "//FrameBox" )) << {Marker Drawing Mode( "Outlined" ), Marker Size( 10 ), Transparency( 0.5 ),
Fill Selection Mode( "Unselected Faded" )};
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsMerci pour vos réponses. J'ai pu adapter le code pour traiter les tracés individuels. Dans mon analyse, j'ai trois sous-intrigues pour chaque ensemble de conditions. J'ai eu recours au codage en dur de l'index des sous-intrigues.
If( Is List( rptDist ),
dists=rptDist;
myBys1 = Transform each ({myexpr} , rptDist << Get Where Expr, Arg(myExpr , 1 ));
myBys2 = Transform each ({myexpr} , rptDist << Get Where Expr, Arg(myExpr , 2 ));
myBys3 = Transform each ({myexpr} , rptDist << Get Where Expr, Arg(myExpr , 3 ));
, //else condition - no By conditions in Distribution call
dists = Eval List( {rptDist} );
myBys= {};
);Passons à un nouveau défi. En effet, l'utilisation d'appels de tableaux associatifs entraîne une perte d'informations. Je vais créer un article séparé pour le prochain défi puisque l'objectif de traçage ici a été atteint.
Merci à tous !
Ré : Mettre en surbrillance les compartiments dans une distribution en fonction d'une valeur de colonne pour mettre en surbrillance la migration des compartimentsSalut Jarmo,
I've added the nested for loops which achieved the desired result. Without the second loop the added reference would only appear in the first of the three plots. Please note that I assigned numOfPlots a constant value of 3. I was looking for a way to interrogate the report(AxisBox... for dimensions, but I did not find the right object to return the correct count.
Au total, il y a trois boucles imbriquées pour produire des distributions et les annoter avec des lignes de référence.
...
For Each( {report, idx}, distRPTs, //grab each report in the
...
For Each( {bin, index}, theBins, //process bin for each report
...
For( iPlot = 1, iPlot <= numOfPlots, iPlot +=1, << add refer. in each of the subplots.
...
...<BR />For Each( {bin, index}, theBins,
binList = {};
//TBD change bin width to avoid offset when bin width is an odd number
Insert Into( binList, bin - theIncr / 2 );
Insert Into( binList, bin + theIncr / 2 );
For( iPlot = 1, iPlot <= numOfPlots, iPlot +=1,
Eval( Eval Expr(report[AxisBox( iPlot )] << Add Ref Line( Expr( binList ), "Solid", Expr( Index + 2 ), "", 1, 0.25 ) ) );
);
);