Múltiples líneas de referencia en el eje xHola,
Para un proyecto en el que estoy trabajando, he creado un gráfico con el tiempo en el eje x que muestra un período de aproximadamente 24 horas. Para ilustrar visualmente cuándo es de día y de noche, he agregado líneas de referencia como se muestra en el siguiente guión y en la imagen adjunta.
Propiedades para la columna del eje x:
SableData << New Column(
"Time since first dose-[hours]",
Numeric, "Continuous",
Format("Best", 12),
Formula((:Date Time - :StartTime) / (60 * 60)),
Set Property("Spec Limits", {LSL(8), USL(20), Show Limits(0)}), Set Selected);
Crear gráfico, agregar y configurar líneas de referencia:
Oxygen consumption = SableData << Graph Builder(
Size( 1007, 689 ),
Variables(
X( :Name( "Time since first dose-[hours]" ) ),
Y( :Name("VO2-[ml/min]" )),
Overlay( :Treatment )
),
Elements( Line( X, Y, Legend( 21 ), Error Bars( "Standard Error" ) ) ),
SendToReport(
Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( "Oxygen consumption" )} ),
Dispatch(
{},
"Time since first dose-[hours]",
ScaleBox,
{Min( 168 ), Max( 288), Inc( 2 ), Minor Ticks( 12 )}
),
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
21,
Properties( 0, {Line Color( 0 )}, Item ID( "A", 1 ) ),
Properties(
1,
{Line Color( 53 )},
Item ID( "B", 1 )
),
Properties(
2,
{Line Color( 37 )},
Item ID( "C", 1 )
),
Properties( 3, {Line Color( 0 )}, Item ID( "A", 2 ) ),
Properties(
4,
{Line Color( 53 )},
Item ID( "B", 2 )
),
Properties(
5,
{Line Color( 37 )},
Item ID( "C", 2 )
)
)}
),
Dispatch( {}, "Graph Builder", FrameBox, {Marker Size( 0 )} ),
Dispatch( {}, "400", LegendBox, {Set Title( "" )} )
)
);
Eval(
Substitute(
Expr(
Report( Oxygen consumption )[AxisBox( 1 )] << Add Ref Line( {__LSL__, __USL__}, "Solid", "Black", "", 1, 0.25 ) //try show limits(1) in spec limits
),
Expr( __LSL__ ), (SableData:Name( "Time since first dose-[hours]" ) << get property( "spec limits" ))["LSL"],
Expr( __USL__ ), (SableData:Name( "Time since first dose-[hours]" ) << get property( "spec limits" ))["USL"]
));
Pero ahora tengo datos que cubren dos semanas y todavía me gustaría ilustrar visualmente cuándo es de día y de noche. Por supuesto, puedo agregarlos manualmente y copiar el script, pero me gustaría hacerlo de manera sólida.
¿Puedo de alguna manera agregar estas propiedades adicionales a la "Tiempo desde la primera dosis-[horas]" columna o es posible crear una tabla de datos separada que incluya todos los límites y colocarlos en la tabla de datos de una sola vez?
Gracias de antemano.
hermano julie

La personalización en masaIngeniería de Calidad y ProcesosRe: Múltiples líneas de referencia en el eje xDe hecho, tuve ayuda con eso y resultó algo como esto:
DarkLight = SableData << select where(:NewPhase == "new" ) << subset(
Output Table("DarkLight"),
columns(
:Date,
:Phase,
:Name("Time since first dose-[hours]"),
:NewPhase)
);
DarkLight:Date << data type( Character ) << Set Modeling Type( Nominal );
DarkLight << new column("Phase per day", Character, "Nominal", Formula( :Date || "-" || :Phase ) );
DarkLight << new column("High", Numeric, "Continuous", Formula(
Lag( :Name( "Time since first dose-[hours]" ), -1 ))
);
DarkLight:High << delete formula;
DarkLight << new column("Color", Character, "Nominal", set each value("Grey"));
column(DarkLight, "Time since first dose-[hours]") << Set Name("Low");
DarkLight << select where(:Phase == "Light phase") << delete rows;
RQ = SableData << Graph Builder(
Size( 938, 712 ),
Variables(
X( :Name( "Time since first dose-[hours]" ) ),
Y( :RQ ),
Overlay( :Treatment )
),
Elements( Points( X, Y, Legend( 4 ) ) )
);
x axis = Report( RQ )[AxisBox(1)];
For Each Row( DarkLight,
// draw colored regon
Eval( Eval Expr( x axis << Add Ref Line( { Expr( :Low ), Expr( :High ) }, "Solid", Expr( :Color ), , , 0.25 ) ) );
// draw border lines
Eval( Eval Expr( x axis << Add Ref Line( Expr( :Low ), "Solid", "Black" ) ) );
Eval( Eval Expr( x axis << Add Ref Line( Expr( :High ), "Solid", "Black" ) ) );
);
Re: Múltiples líneas de referencia en el eje xEse es un conjunto de datos muy divertido, gracias por publicarlo y por sus preguntas.
Si tuviera un tiempo infinito, se vería aún mejor si las fases oscuras fueran una línea de intervalo sombreada un poco de gris. ¿Tal vez alguien más pueda recoger eso y ejecutarlo?
Re: Múltiples líneas de referencia en el eje xWow muchas gracias por la explicación. Eso tenía sentido y funciona muy bien también.
Re: Múltiples líneas de referencia en el eje xEl segundo problema con las líneas de fase clara y oscura que no aparecen donde se esperaba se debe a una falta de coincidencia entre la variable del eje y la variable utilizada para definir dónde deben ir las líneas.
En el gráfico, el eje x es una duración y en el script personalizado las líneas se basan en el número de fila, por lo que el generador de gráficos usa el número de fila y lo traza en la duración del tiempo, lo que simplemente no funciona.
Agregué un par de columnas a la tabla de datos, son similares a algunas de las columnas originales, pero con algunos pequeños ajustes y diferencias de formato.
//if you have the data table open, make it the active table and run this
dt=current data table();
dt<<NEW column=""></NEW>
El siguiente paso es editar el script personalizado en el gráfico.
//This script goes into the Custom Script in the graph builder plot
For Each Row( If( Is Missing( :NewPhase ) == 0, V Line( :Time2 ) ) );
For Each Row(
If( Is Missing( :NewPhase ) == 0,
Text( {:Time2, 5 + :step2}, " "||:Phase2 )
)
);
//The, " "||:phase2, inserts a space before the label so that it isn't touching the phase line.
El resultado es el gráfico fijo, como este.

Con todos los cambios, el eje x ahora está en formato Días:Horas:minutos, y todas las líneas de fase claras y oscuras se muestran en el lugar correcto. La etiqueta de la fase está abreviada para que no se superponga y solo haga un revoltijo de texto desordenado.
Guión gráfico
Graph Builder(
Size( 1455, 290 ),
Show Control Panel( 0 ),
Variables( X( :Time2 ), Y( :Name( "EE-[kcal/h]" ) ), Overlay( :Treatment ) ),
Elements( Line( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch(
{},
"Time2",
ScaleBox,
{Min( -586333.5 ), Max( 2531060.48337292 ), Interval( "Day" ), Inc( 1 ),
Minor Ticks( 6 ), Label Row( Label Orientation( "Perpendicular" ) )}
),
Dispatch(
{},
"EE-[kcal/h]",
ScaleBox,
{Format( "Best", 12 ), Min( 1.7751677852349 ), Max( 5.7751677852349 ),
Inc( 1 ), Minor Ticks( 0 )}
),
Dispatch(
{},
"Graph Builder",
FrameBox,
{Add Graphics Script(
2,
Description( "Script" ),
For Each Row( If( Is Missing( :NewPhase ) == 0, V Line( :Time2 ) ) );
For Each Row(
If( Is Missing( :NewPhase ) == 0,
Text( {:Time2, 5 + :step2}, " " || :Phase2 )
)
);
), Grid Line Order( 1 ), Reference Line Order( 3 ),
DispatchSeg(
TopSeg( 1 ),
{Set Script(
For Each Row(
If( Is Missing( :NewPhase ) == 0,
V Line( :Time2 )
)
);
For Each Row(
If( Is Missing( :NewPhase ) == 0,
Text( {:Time2, 5 + :step2}, " " || :Phase2 )
)
);
)}
)}
)
)
)Re: Múltiples líneas de referencia en el eje xparece que funciona bien, pero no como se esperaba, posiblemente debido a un valor atípico...

la columna max() de la variable del eje Y está por encima de 23. Así que el texto aparece fuera de escala con el resto de la figura.
Re: Múltiples líneas de referencia en el eje xHola @Byron_JMP
Gracias por la sugerencia.
Intenté usar la configuración que describe y funcionó hasta cierto punto. Para seguir el mismo proceso, creé una nueva columna en mi tabla de datos (NewPhase) donde las filas que no faltan deberían dar como resultado una línea de evento.
Basé la salida de la columna NewPhase únicamente en el número de animal con el mayor número de filas para que solo obtenga un conjunto de líneas de eventos en lugar de uno para cada animal:
DataPointsAnimal = SableData << Summary(
Group( :Animal No. ),
N( :Phase ),
Freq( "None" ),
Weight( "None" ));
DataPointsAnimalSorted = DataPointsAnimal << Sort( By( :N Rows ), Order( Descending ) );
Close( DataPointsAnimal, No Save );
AnimalVar = DataPointsAnimalSorted:Animal No.[1];
SableData << New column("NewPhase", Formula(If( :Animal No. == AnimalVar,
If( :Phase == Lag( :Phase, 1 ),
.,
"new"
),
.
)));Luego creé el gráfico con tu entrada.
Graph Builder(
Size( 924, 695 ),
Variables(
X( :Name( "Time since first dose-[hours]" ) ),
Y( :Name( "EE-[kcal/h]" ) ),
Overlay( :Treatment )
),
Elements( Line( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Add Graphics Script(
2,
Description( "Script" ),
For Each Row( If( Is Missing( :NewPhase ) == 0, V Line( Row() ) ) );
For Each Row(
If( Is Missing( :NewPhase ) == 0,
Text(
Right Justified,
{Row(), Col Maximum( :Name( "EE-[kcal/h]" ) ) * 1.2},
:Phase
)
)
);
), Grid Line Order( 1 ), Reference Line Order( 3 )}
)
)
);Pero por alguna razón, solo incluye una cantidad limitada de líneas y no incluye ningún texto.
¿Qué estoy haciendo mal?
Re: Múltiples líneas de referencia en el eje xHe usado columnas para definir cuándo agregar líneas de referencia. Supongo que sería igual de fácil agregar rangos también.
Aquí hay algunas notas que pueden ser útiles: Líneas de eventos y comentarios en gráficos de control