Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xJ'ai un tableau de données avec les colonnes « Heure » (numérique, continue, formatée en 12 h h:m:s) et « Nom » (caractère, simplement la liste de l'expérience à laquelle chaque point temporel est associé). Lorsque je représente un graphique en utilisant d'autres colonnes non mentionnées ici comme axe des Y et « Heure » comme axe des X, le problème se pose lorsque chaque tracé entre les variables de regroupement X est décalé, car l'échelle de l'axe des X reste la même entre les variables de regroupement X (Figure 1).

Figure 1. Chaque variable de regroupement x est une variable de colonne « Nom » avec « Nom » également comme superposition.
Mon idée est d'écrire un script pour :
1. Créer une nouvelle colonne
2. Codez une nouvelle colonne avec une formule qui convertit la colonne « Heure » en temps en secondes, en commençant à « 0 » et en comptant avec un intervalle spécifié (2 secondes dans ce cas), en réinitialisant à 0 dès que la colonne « Nom » change de valeur.
Mes principales questions sont :
1. Est-ce possible ?
2. Existe-t-il un moyen plus simple de le faire sans créer une nouvelle colonne ?
Actuellement sur JMP 17.2.0 sur Windows 10.
Merci!
Exploration et visualisation des donnéesRe : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xVoyez si cela fait ce dont vous avez besoin.
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
Re : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xMerci pour la réponse !
Malheureusement, cela renvoie la colonne « Temps écoulé » visible dans la figure ci-dessous.

J'ai essayé le code suivant, qui a également généré la colonne « Heure (s) » dans la figure ci-dessus. Il semble qu'il effectue la fonction de mise à zéro initiale, mais ne convertit rien d'autre.
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
);
Re : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xIl se peut qu'il y ait un problème inattendu dans votre colonne :LocalTime. J'ai testé ma formule sur un tableau artificiel et elle a fonctionné comme prévu. Comment votre colonne :LocalTime est-elle formatée ?

Re : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xJ'ai créé un exemple de tableau de données

Et puis j'ai exécuté le JSL suivant
Names Default To Here(1); // Ensure scope is local for column references
dt = Current Data Table(); // Reference to the active data table
// Add a new numeric column "Time (s)" with the specified formula
dt << New Column( "Time (s)",
Numeric, Continuous, Format( "Best", 12 ), // numeric format (optional)
Formula(
If(
Row() == 1,
// Case 1: First row of the table -> start at 0 seconds
0,
:Name("Name") != Lag( :Name("Name") ),
// Case 2: Identifier changed from the previous row -> new run, reset time to 0
0,
// Case 3: Otherwise (same run as previous row) -> accumulate time difference
Lag( :Name("Time (s)") ) + ( :LocalTime - Lag( :LocalTime ) )
)
)
)
dt << New Column( "ElapsedTime", numeric, continuous, Formula( :LocalTime - Col Min( :Local Time, :Name ) ) );
Un résultat obtenu

Re : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xBon, peu importe, le code que j'ai posté fonctionnait vraiment ! Le nom de ma colonne était mal orthographié.:confounded_face:
La seule question qui reste alors serait : existe-t-il un moyen plus simple de le faire sans créer une nouvelle colonne ?
Re : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xCela nécessite une nouvelle colonne. Il n'est pas nécessaire que ce soit une colonne persistante, ce qui signifie qu'il peut s'agir d'une colonne qui existe uniquement tant que le graphique est présent.
Graph Builder(
Transform Column(
"Time (s)",
Formula( :LocalTime - Col Min( :LocalTime, :Name ) )
),
Show Control Panel( 0 ),
Variables( X( :"Time (s)"n ), Y( :Y Column ), Group X( :Name ) ),
Elements( Smoother( X, Y, Legend( 8 ) ) )
);
Re : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xVous pouvez toujours utiliser une colonne de transformation (virtuelle) lors de l'exécution de votre générateur de graphiques. Ainsi, vous n'avez pas besoin d'avoir une colonne réelle dans votre table de données.
Re : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xC'est parfait. Merci à toi et à @txnelson pour ces excellentes solutions !
Re : Conversion du temps en intervalles de temps et réinitialisation en fonction des valeurs de la deuxième colonne pour éviter le décalage de l'axe des xÀ titre d'information, la norme JMP consiste à placer les unités de mesure dans la propriété de colonne « Unités ». Dans votre cas, la différence réside dans le fait que le nom de la colonne serait « Heure ». Cependant, par défaut, la valeur « Unités » est affichée entre parenthèses, ce qui modifie la valeur affichée en « Heure (s) ».