Hola programadores de JSL,
Estoy trabajando en un script donde añado mi propia leyenda a un gráfico. Vea la captura de pantalla a continuación.

He añadido las líneas y el texto haciendo clic con el botón derecho en el gráfico, seleccionando Personalizar...> y luego añadiendo un script al gráfico. El siguiente código JSL genera la "leyenda" que se muestra arriba.
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( [20, 100], [65, 65] );
Text( {120, 64}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( [20, 100], [60, 60] );
Text( {120, 59}, "Height" );
Pero, lo que realmente busco es cómo hacer que las posiciones de las líneas de la leyenda y el texto sean relativas, por ejemplo, al 90% del valor máximo en la columna: "Weight diff [g]"n. La tabla de datos también se adjunta con el script (el script que no funciona está comentado). Pensé que podría hacerlo con algo como un JSL del tipo Eval(Substitute(Expr(...), Expr(__pos__), pos), pero sigo recibiendo el error "Invalid Matrix Token". Con algo como lo siguiente:
Names Default To Here( 1 );
pos = Col Max( :"Weight diff[g]"n );
Eval(
Substitute(
Expr(
Graph Builder(
Size( 510, 510 ),
Show Legend( 0 ),
Graph Spacing( 4 ),
Variables(
X( :"MeasTime [s]"n ),
Y( :"Weight diff [g]"n ),
Y( :"Height diff [mm]"n, Position( 1 ), Side( "Right" ) )
),
Elements( Line( X, Y( 1 ), Legend( 5 ) ), Line( X, Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "MeasTime [s]", ScaleBox, {Inc( 100 )} ),
Dispatch( {}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description( "" ),
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( [20, 100], [__pos__, __pos__] );
Text( {120, 64}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( [20, 100], [60, 60] );
Text( {120, 59}, "Height" );
)}
)
)
)
),
Expr( __pos__ ), Eval( Round( 0.9 * pos, 0 ) )
)
);
Incluso he intentado encerrar las coordenadas Y de la función Line() entre "{ }", como en: Line( [20, 100],[{_pos__,__pos__}]), y sigo obteniendo el mismo error. Preferiría usar una variable como "pos", que obtengo de una columna, en lugar de tenerla como un valor absoluto, ya que los valores de la columna pueden cambiar y necesito que los objetos del gráfico, como la línea y el texto, puedan moverse en relación con lo que se está graficando.
¿Alguna sugerencia sobre cómo solucionar este error o qué me estoy perdiendo? Este método debería funcionar, pero no logro entender por qué.
¡Gracias!,
DS
Hola @jthi ,
¡Gracias por la sugerencia! Con una pequeña modificación, me ayudó muchísimo y conseguí justo lo que necesitaba. ¡Gracias!
¡Gracias también por la rápida respuesta!
DS
Por si a otros lectores les interesa, he modificado el código JSL (véase más abajo) para:
Names Default To Here( 1 );
x1=300;
y2=36.7;
Graph Builder(
Size( 510, 510 ),
Show Legend( 0 ),
Graph Spacing( 4 ),
Variables( X( :"MeasTime [s]"n ), Y( :"Weight diff [g]"n ), Y( :"Height diff [mm]"n, Position( 1 ), Side( "Right" ) ) ),
Elements( Line( X, Y( 1 ), Legend( 5 ) ), Line( X, Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "MeasTime [s]", ScaleBox, {Inc( 100 )} ),
Dispatch( {}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description( "" ),
Pen Color( "Black" );
Line Style( "Dashed" );
Line( {x1,YOrigin()}, {x1,y2}, {XOrigin(),y2}, {x1,y2} );
Pen Color( "Red" );
Pen Size( 2 );
Line Style( "Solid" );
Line( {XOrigin()+30, 0.9*YRange()}, {XOrigin()+130, 0.9*YRange()} );
Text( {XOrigin()+150, 0.9*YRange()-1}, "Weight" );
Pen Color( "Blue" );
Pen Size( 2 );
Line( {XOrigin()+30, 0.85*YRange()}, {XOrigin()+130, 0.85*YRange()} );
Text( {XOrigin()+150, 0.85*YRange()-1}, "Height" );
)}
)
)
);
Lo que produce el siguiente resultado:

Estas son demostraciones de exactamente lo que quería hacer: crear "leyendas" relativas y líneas de referencia específicas que no abarquen toda la longitud/altura del gráfico.
Esperemos que esto pueda ayudar a otros que quieran hacer algo similar.
¡Espero que esto ayude a otros!
DS
Quizás convenga evaluar las coordenadas x1 e y2 en el script gráfico para evitar todo tipo de problemas potencialmente molestos.
Ver más...
Names Default To Here(1);
x1 = 300;
y2 = 36.7;
dt = Current Data Table();
gb = Eval(Substitute(
Expr(dt << Graph Builder(
Size(510, 510),
Show Legend(0),
Graph Spacing(4),
Variables(X(:"MeasTime [s]"n), Y(:"Weight diff [g]"n), Y(:"Height diff [mm]"n, Position(1), Side("Right"))),
Elements(Line(X, Y(1), Legend(5)), Line(X, Y(2), Legend(6))),
SendToReport(
Dispatch({}, "MeasTime [s]", ScaleBox, {Inc(100)}),
Dispatch({}, "Graph Builder", FrameBox,
{Add Graphics Script(
5,
Description(""),
Pen Color("Black");
Line Style("Dashed");
Line({_x1_, Y Origin()}, {_x1_, _y2_}, {X Origin(), _y2_}, {_x1_, _y2_});
Pen Color("Red");
Pen Size(2);
Line Style("Solid");
Line({X Origin() + 30, 0.9 * Y Range()}, {X Origin() + 130, 0.9 * Y Range()});
Text({X Origin() + 150, 0.9 * Y Range() - 1}, "Weight");
Pen Color("Blue");
Pen Size(2);
Line({X Origin() + 30, 0.85 * Y Range()}, {X Origin() + 130, 0.85 * Y Range()});
Text({X Origin() + 150, 0.85 * Y Range() - 1}, "Height");
)}
)
)
)),
Expr(_x1_), x1,
Expr(_y2_), y2
)
);