Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenIch habe eine Reihe von Verteilungen, die eine Population von Einheiten enthalten. Ich habe eine Auswahl mit einem „containsitem“ -Aufruf verwendet, um die Listenelemente in meinem Datensatz auszuwählen, die bestimmten DUT-Referenz-ID-Nummern entsprechen. Dies hilft zu zeigen, welche Behälter die Messungen für die betreffenden Einheiten enthalten. Ich möchte das Testdatum für jede Instanz der Auswahl verwenden, um den Behälter mit den Messungen hervorzuheben. Wenn beispielsweise dieselbe Einheit am 20.06.2024 getestet und später am 25.06.2024 erneut getestet wurde, dann noch einmal am 28.06.2024. Das Behälterergebnis vom 20.06. würde mit einer Farbe hervorgehoben und das Behälterergebnis vom 25.06. und 28.06. mit zwei anderen Farben. Einige andere Ziele sind, dass diese Farben über die Verteilungen im Bericht hinweg konsistent sind (eine Farbe für jedes Testdatum), wobei alle nicht ausgewählten Einheiten bei der Standardfarbe verbleiben. Ich möchte auch, dass die Hervorhebung für den jeweiligen Behälter von oben nach unten im Diagramm verläuft.
Wir wissen Ihre Unterstützung sehr zu schätzen.
//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
)
);

Modell dessen, was ich erreichen möchte:

Grundlegende Datenanalyse und ModellierungZuverlässigkeitsanalyseBetreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenKönnten Sie eine geeignete Datei aus dem Beispielordner auswählen und ein Modell erstellen, das das Problem veranschaulicht?
Die Vorteile:
- spart Zeit (#1) :
kein Benutzer muss einen Mockup-Datensatz erstellen - spart Zeit (#2):
hilft, das Problem zu verstehen - Alle Antworten basieren auf einem gemeinsamen Modell
-> einfach vergleichen

zB mit Temperaturdaten, Bundeslandauswahl und Farben nach Quartalen – statt Originaldaten, DUT-Auswahl und Farben nach Messdaten – ist das Ihr Interesse?
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" )} )
)
);
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenDies kann man zum Beispiel mit Hilfe von Hilfslinien erreichen.
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);

oder mit grafischen Skripten
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);
);

Um für alle Verteilungen die gleiche Farbgebung zu erzielen, können Sie für Ihre Daten die Eigenschaft „Wertfarben“ festlegen und diese beim Festlegen der Farben nutzen oder eine Liste mit Farben erstellen und diese der Reihe nach verwenden.
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenHier ist meine Vorgehensweise. Es findet die ausgewählten Zeilen und die ihnen zugeordneten Behälter und fügt dann die Referenzzeilen nach Bedarf hinzu.

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 ) ) );
);
Eine Erweiterung hiervon, bei der sich das Diagramm interaktiv ändert, wenn der Benutzer verschiedene Zeilen auswählt und abwählt, würde das Hinzufügen eines RowState-Handlers und einer Logik erfordern, die zuerst alle vorhandenen Referenzlinien entfernt und dann die neuen hinzufügt.
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenEine zu beantwortende Frage:
wie sollen die Farben zugeordnet und der Bereich gekennzeichnet werden.
zB wenn 6/20 Daten für die ausgewählten IDs sind: 48, 90 (77, 56, ...).
Oder umgekehrt: Können wir sicher sein, dass sich die Daten für alle ausgewählten Geräte-IDs an einem Datum im selben Behälter befinden?
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenNotiert. Danke. Ich werde meine Frage anpassen, um verfügbare Daten zu verwenden, wie Sie vorgeschlagen haben.
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenDanke für die Unterstützung.
Ich konnte den Add-Ref verwenden, wie Sie und @jthi vorgeschlagen haben. Ich habe den Ansatz zur Farbgebung verwendet und bestätigt, dass er für eine einzelne Verteilung funktioniert. Wenn ich By-Bedingungen hinzufüge, verliere ich die Möglichkeit zur Plot-Adressierung, was zu Fehlern führt.
Wie von @hogi vorgeschlagen, habe ich für diese Frage auf verfügbare Daten umgestellt. Um die Frage zu vereinfachen, habe ich Big Class in einer modifizierten Version von Jims Skript erweitert. Hier sind die Schritte, die ich befolgt habe, und die Ergebnisse
1. Große Klasse importieren
2. Fügen Sie bedingt einige Daten hinzu, wenn die Spalte "Bundesland" nicht in der Tabelle enthalten ist
a. Fügen Sie eine Spalte mit dem Namen „Bundesstaat“ mit sequenziellen Daten hinzu, um Personen entweder in „CA“, „WA“ oder „OR“ einzuordnen.
b. Fügen Sie eine zweite „PATTY“ hinzu, die 16, „W“, 57, 134 Jahre alt ist und in „WA“ lebt.
3. Wählen Sie einige Namen aus. Ich habe LESLIE und PATTY gewählt
4. Führen Sie das Skript aus, um interessante Behälter zu finden und hervorzuheben.
OK 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 hat einen guten Punkt bezüglich der Entscheidung darüber gemacht, welche Farbe angezeigt wird. Sobald ich die Elementadressierung verstanden habe, plane ich, eine Bedingung für den Fall hinzuzufügen, dass mehr als ein interessanter Datenpunkt im selben Bin auftritt.

NG- Fall – führen Sie die Verteilung mit einer By-Bedingung basierend auf :State aus und sehen Sie einen Fehler bei der Adressierung des Plot-Objekts. Ich habe einige Adressierungspermutationen ohne Erfolg ausprobiert. Mir fehlen wichtige Informationen für den Zugriff auf die AxisBox.
Hat auch nicht funktioniert:
distRPT = Report( dist )["Höhe",AxisBox( 1 )];
distRPT = Report( dist )["Staat=WA","Höhe",AxisBox( 1 )];
distRPT = Bericht( dist["Staat=WA"] )["Höhe",Achsenbox( 1 )];
Beispiel-Fehlercode: Objekt in Zeile 41 beim Zugriff oder bei der Auswertung von 'Report(dist)[ /*###*/AxisBox(1)]' , Report( dist )[/*###*/AxisBox( 1 )] nicht indiziert werden kann.
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 ) ) );
);
Wir freuen uns über Ihre Kommentare und Anleitungen.
Danke!
Bryan
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenHübsch : )
zum Thema "Finde die richtige Achsbox" dieser Wunsch in der Wunschliste:
Erleichtern Sie das Abrufen von Ergebnissen aus Berichten über JSL
hat den Status „in der Warteschlange“ – ich hoffe, dass es neben dem „einfacheren Abrufen von Ergebnissen aus Berichten“ auch das Auffinden der richtigen Achsenbox erleichtert …
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenMeine erste Vermutung ist, dass Sie versuchen, die Funktion Report() auf eine Liste anzuwenden (prüfen Sie, was dist enthält, indem Sie Show(dist); verwenden), wenn Sie By verwenden.
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenWenn Sie die BY-Gruppen benötigen, wird es etwas komplizierter.
Jeder Subplot kann unterschiedliche Bin-Breiten haben. Deshalb ist eine For-Schleife notwendig:
- um die einzelnen Behälterbreiten zu erhalten.
- um die ausgewählten Zeilen für das jeweilige Subplot abzurufen
- um die Referenzzeilen zum jeweiligen Nebenplot hinzuzufügen.
Hm, vielleicht sollten wir die Idee mit den schattierten Bereichen noch einmal überdenken – wir haben auch das Problem mit den Farben.
Im Moment wenden wir einfach auf jeden ausgewählten Behälter eine andere Farbe an. Die schattierten Bereiche sehen gut aus – aber die Breite ist ziemlich beliebig. Vielleicht einfach eine Linie pro ausgewählter ID hinzufügen? Wie viele „IDs“ möchten Sie auswählen?
Wenn es nach Klebeband riecht, ist es Zeit zu fragen: Erfinden wir das Rad neu?
Im Allgemeinen kann Graph Builder solche Dinge automatisch erledigen, ohne dass mit der Berichtsebene kommuniziert werden muss ...
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 ) );Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenüber den 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" )};
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenVielen Dank für Ihre Antworten. Ich konnte den Code anpassen, um die einzelnen Plots anzusprechen. In meiner Analyse habe ich drei Nebenplots für jeden Satz von Bedingungen. Ich habe den Nebenplot-Index fest codiert.
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= {};
);Auf zu einer neuen Herausforderung. Durch die Verwendung von Associative Array-Aufrufen gehen Informationen verloren. Ich werde für die nächste Herausforderung einen separaten Beitrag erstellen, da das Plotziel hier erreicht wurde.
Vielen Dank an alle!
Betreff: Markieren Sie Behälter in einer Verteilung basierend auf einem Spaltenwert, um die Behältermigration hervorzuhebenHallo 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.
Insgesamt gibt es drei verschachtelte For-Schleifen, um Verteilungen zu erzeugen und diese mit Referenzlinien zu versehen.
...
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 ) ) );
);
);