Tracé de corrélation sans modifier la structure de la table de donnéesJe voudrais faire un graphique de corrélation pour comparer le paramètre testé (Id) entre TestStages pour différentes parties, comme indiqué dans l'exemple de tableau de données ci-joint.
Je veux la médiane pour Id1 (pour toutes les pièces) sur l'axe des x et la médiane pour Id2 (pour toutes les pièces) sur l'axe des y avec les limites associées réf. lignes sur les axes respectifs (c'est-à-dire les lignes verticales LSL/USL pour TestStage 1 nécessaires sur l'axe x tandis que les lignes horizontales LSL/USL pour TestStage 2 sont nécessaires sur l'axe y).
Comment faire cela sans modifier la structure de la table de données à l'aide de JSL ?
Comme fait ci-dessous, je peux faire ce type de graphique de corrélation si j'ai la médiane pour Id1 et Id2, les limites, etc. en tant que données de colonne (et non en tant que données de ligne comme ci-joint).
Je ne veux pas modifier la structure de la table de données (que j'extrait à l'aide d'un autre script JSL) ou générer une nouvelle table de données (en utilisant split() comme ci-dessous) basée sur celle-ci, d'où ma question.
Names Default To Here (1);
Data Table( "egDataTable" ) << Split(
Split By( :TestStage ),
Split( :Median, :LSL, :USL ),
Remaining Columns( Drop All ),
Sort by Column Property
);
Graph Builder(
Size( 528, 457 ),
Show Control Panel( 0 ),
Variables(
X( :Median 1 ),
X( :LSL 1, Position( 1 ) ),
X( :USL 2, Position( 1 ) ),
Y( :Median 2 ),
Y( :LSL 2, Position( 1 ) ),
Y( :USL 2, Position( 1 ) )
),
Elements(
Points( X( 1 ), X( 2 ), X( 3 ), Y( 1 ), Y( 2 ), Y( 3 ), Legend( 65 ) )
),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
65,
Properties(
0,
{Marker( "Star" )},
Item ID( "Median 2 / Median 1", 1 )
),
Properties(
1,
{Marker( "Minus" )},
Item ID( "LSL 2 / Median 1", 1 )
),
Properties(
2,
{Marker( "Minus" )},
Item ID( "USL 2 / Median 1", 1 )
),
Properties(
3,
{Marker( "Pipe" )},
Item ID( "Median 2 / LSL 1", 1 )
),
Properties( 4, {Marker( "Minus" )}, Item ID( "LSL 2 / LSL 1", 1 ) ),
Properties( 5, {Marker( "Minus" )}, Item ID( "USL 2 / LSL 1", 1 ) ),
Properties(
6,
{Marker( "Pipe" )},
Item ID( "Median 2 / USL 2", 1 )
),
Properties( 7, {Marker( "Minus" )}, Item ID( "LSL 2 / USL 2", 1 ) ),
Properties( 8, {Marker( "Minus" )}, Item ID( "USL 2 / USL 2", 1 ) )
)}
)
)
);
Automatisation et scriptRe : Tracé de corrélation sans modifier la structure de la table de donnéesSalut @Néo ,
Je ne sais pas si je comprends entièrement votre problème, mais voici comment je l'ai interprété pour trouver ce que je pense être une solution. Tout d'abord, il est clair que vous ne voulez pas modifier la structure de la table, ce qui est compréhensible, surtout si vous concevez cela pour qu'il soit exécuté comme un script JSL automatisé ou quelque chose du genre.
Le script JSL ci-dessous est UNE façon de le faire. Je suis sûr qu'il y en a beaucoup d'autres, mais cela vous met au moins dans la bonne direction, où vous pouvez maintenant le modifier comme vous le souhaitez, pour la couleur, le style, etc. Ce n'est peut-être pas exactement ce que vous recherchez, mais je pense que ça devrait être proche.
Names Default To Here( 1 );
dt = Data Table( "egDataTable" );
dt << New Column( "Median1", Continuous, Numeric );
dt << New Column( "Median2", Continuous, Numeric );
For( i = 1, i <= N Rows( dt ), i++,
If(
:TestParameter[i] == "Id1" & :TestStage[i] == 1,
:Median1[i] = :Median[i];
_LSL1_ = :LSL[i];
_USL1_ = :USL[i];,
:TestParameter[i] == "id2" & :TestStage[i] == 2,
:Median2[:PartNumber[i]] = :Median[i];
_LSL2_ = :LSL[i];
_USL2_ = :USL[i];,
.
)
);
Graph Builder(
Graph Spacing( 4 ),
Variables( X( :Median1 ), Y( :Median2 ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"Median1",
ScaleBox,
{Min( 0 ), Max( 1.1 ), Inc( 0.2 ), Minor Ticks( 1 ), Add Ref Line( _LSL1_, "Solid", "Blue", "LSL1", 1 ),
Add Ref Line( _USL1_, "Solid", "Blue", "USL1", 1 )}
),
Dispatch(
{},
"Median2",
ScaleBox,
{Min( -0.03 ), Max( 0.8 ), Inc( 0.1 ), Minor Ticks( 0 ), Add Ref Line( _LSL2_, "Solid", "Blue", "LSL2", 1 ),
Add Ref Line( _USL2_, "Solid", "Blue", "USL2", 1 )}
),
Dispatch( {}, "400", ScaleBox, {Legend Model( 3, Properties( 0, {Marker( "Star" )}, Item ID( "Median2", 1 ) ) )} )
)
);
J'espère que cela t'aides!,
DS
*Edit : Une chose que je voulais mentionner est que si vous voulez généraliser cela pour travailler avec d'autres types de tables de données, vous voudrez peut-être envisager d'avoir une cohérence entre les étiquettes, par exemple, votre colonne TestParameter a un mélange de minuscules et de majuscules, par exemple Id1, id2, id3, au lieu d'être tous ID#, ou id#, etc. Lors du codage conditionnel, c'est parfois beaucoup plus facile lorsque vous avez une syntaxe cohérente, il y a donc moins de chances d'avoir à déboguer à cause de la casse des lettres.
Re : Tracé de corrélation sans modifier la structure de la table de données@SDF1 Merci pour vos contributions.
Le tableau que j'ai joint est un exemple de tableau concocté afin que je puisse montrer à quoi je voulais que l'intrigue ressemble. Dans le cas réel, chaque étape de test a environ 50 paramètres de test testés et il y a 10 étapes de test.
Je ne voudrais pas générer une colonne pour chaque paramètre testé à chaque étape de test (votre script si je comprends bien) pour comparer avec une autre étape de test, sauf s'il existe une autre approche qui n'a pas besoin de générer de nouvelles colonnes. De plus, il y a des milliers de pièces testées, donc l'ensemble de données est normalement assez volumineux pour commencer.
Je pense que je vais changer mon approche et demander à l'utilisateur de sélectionner les deux étapes de test et les paramètres à corréler, puis de partir de là.
S'il existe une approche plus efficace, je suis tout ouïe/yeux 
Re : Tracé de corrélation sans modifier la structure de la table de donnéesSalut @Néo ,
J'ai pensé que le tableau de données n'était qu'une maquette. Avec autant de paramètres de test et d'étapes que vous avez, je comprends pourquoi vous ne voudriez pas générer de nouvelles colonnes. Si vous ne souhaitez pas créer de nouvelles colonnes ou diviser la table de données, il existe un autre moyen de représenter graphiquement les données souhaitées, mais vous êtes limité dans les statistiques que vous pouvez effectuer, car les données ne sont pas leur propre colonne dédiée. Vous ne pouvez pas l'utiliser sur d'autres plates-formes au sein de JMP comme vous pouvez le faire pour les colonnes.
Le code ci-dessous générera un graphique avec le même style que vous voulez, mais c'est juste à des fins "d'affichage" car les données qui sont représentées graphiquement sont des données enregistrées en mémoire sous forme de vecteur plutôt que dans la table de données sous forme de colonne. Vous pouvez toujours faire des statistiques - j'ai inclus des statistiques telles que la moyenne et le 1 std dev sous la forme d'un ovale autour de la moyenne. Mais, vous serez limité avec certaines choses à cause de ce que j'ai mentionné auparavant. Vous ne pouvez pas faire une ellipse de densité là-dessus, par exemple (du moins, je ne sais pas comment faire).
Je pense que vous devriez être capable de généraliser le script pour qu'il fonctionne avec le nombre d'étapes de test, de paramètres et de pièces dont vous disposez, vous feriez essentiellement une boucle dans le tableau pour enregistrer tous les vecteurs en mémoire, puis peut-être avoir une fenêtre contextuelle (via Expr() ) pour que l'utilisateur sélectionne les étapes de test qu'il souhaite examiner.
Sortir:

Scénario:
Names Default To Here( 1 );
dt = Data Table( "egDataTable" );
xrows = dt << RowSelection( Select Where( :TestStage == 1 ) ) << get selected rows();
xx = dt:Median[xrows];
xMean = Matrix( Mean( xx ) );
Xstdev = Std Dev( xx );
yrows = dt << RowSelection( Select Where( :TestStage == 2 ) ) << get selected rows();
yy = dt:Median[yrows];
yMean = Matrix( Mean( yy ) );
Ystdev = Std Dev( yy );
obj = New Window( "Example",
gbox = Graph Box(
Frame Size( 300, 300 ),
YName( "Median 2" ),
XName( "Median 1" ),
Y Scale( _LSL2_ - 0.1, _USL2_ + 0.1 ),
X Scale( _LSL1_ - 0.1, _USL1_ + 0.1 ),
Marker( Marker State( 11 ), Color State( 0 ), xx, yy ),
Marker( Marker State( 0 ), Color State( 4 ), xMean, yMean ),
Pen Color( "Green" ),
Oval( xMean - Xstdev, yMean + YStdev, xMean + Xstdev, yMean - Ystdev ),
Title( "Median 2 vs Median 1" )
)
);
yaxisbox = gbox[axisBox( 1 )];
xaxisbox = gbox[axisBox( 2 )];
yaxisbox << Add Ref Line( _LSL2_, "Line", blue, "LSL2" );
yaxisbox << Add Ref Line( _USL2_, "Line", blue, "USL2" );
xaxisbox << Add Ref Line( _LSL1_, "Line", blue, "LSL1" );
xaxisbox << Add Ref Line( _USL1_, "Line", blue, "USL1" );
J'espère que cela vous aidera à démarrer!,
DS