Hola,
Quiero escribir un script con bucle for para generar diagramas de caja con líneas de referencia horizontales y guardarlo. También puedo hacerlo en el generador de gráficos, pero mi conjunto de datos es enorme, por lo que agregar una línea de referencia manualmente tomaría demasiado tiempo.
Tengo dos tablas de datos, una para generar una tabla de datos y otra para generar líneas de referencia.
Quiero tener un bucle para el jugador del diagrama de caja (en este caso, 'a' y 'b) en el eje X y la columna cambiaría para todos los juegos ('Bádminton', 'Tenis de mesa', 'Tenis sobre césped'). El script JMP también leería un archivo más que contiene líneas de referencia y líneas de referencia superpuestas de un juego en particular para esa trama en particular.
Ayúdenos a escribir un guión para este requisito.
Gracias 
| Juego | Línea de referencia 1 | Línea de referencia 2 |
| Bádminton | 7 | 1 |
| Tenis de mesa | 8 | 2 |
| Tenis sobre hierba | 6 | 3 |
| Jugador | Zona | Bádminton | Tenis de mesa | Tenis sobre hierba |
| a | Norte | 2 | 2 | 3 |
| a | Norte | 3 | 6 | 3 |
| a | Norte | 4 | 6 | 5 |
| a | Norte | 5 | 2 | 2 |
| a | Norte | 2 | 5 | 6 |
| a | Norte | 4 | 5 | 6 |
| a | Norte | 4 | 3 | 6 |
| a | Norte | 4 | 5 | 2 |
| a | Norte | 9 | 7 | 6 |
| a | Norte | 5 | 0 | 5 |
| b | Sur | 1 | 3 | 7 |
| b | Sur | 2 | 4 | 7 |
| b | Sur | 4 | 7 | 8 |
| b | Sur | 3 | 6 | 3 |
| b | Sur | 6 | 4 | 5 |
| b | Sur | 2 | 2 | 2 |
| b | Sur | 5 | 8 | 6 |
| b | Sur | 6 | 5 | 2 |
| b | Sur | 7 | 2 | 3 |
| b | Sur | 6 | 4 | 6 |
Entonces habría que utilizar un enfoque diferente. Los límites de respuesta solo admiten Inferior, Medio y Superior.
Aquí hay un script simple que funciona con las tablas de datos que proporcionó y que trazará todas las líneas de referencia.
Names Default To Here( 1 );
dtMain = Data Table( "Main" );
dtLimits = Data Table( "Limits" );
// Get the columns to create box plots for
boxPlotList = dtMain << get column names( string, numeric );
// Get the columns that contain limits
refLineList = dtLimits << get column names( string, numeric );
// Loop across the box plot columns and generate the box plots
For( i = 1, i <= N Items( boxPlotList ), i++,
ow = Oneway( Y( Column( boxPlotList[i] ) ), X( :Player ), Box Plots( 1 ) );
// Find out if any reference line references are specified for the current
// box plot column
refLineMatrix = dtLimits << get rows where( :game == boxPlotList[i] );
// If references are found, then loop across the columns and rows in the Limits table
// and add the reference lines
If( N Rows( refLineMatrix ) > 0,
For( refRow = 1, refRow <= N Rows( refLineMatrix ), refRow++,
For( refCol = 1, refCol <= N Items( refLineList ), refCol++,
refLineValue = Column( dtLimits, refLineList[refCol] )[refRow];
Report( ow )[AxisBox( 1 )] << Add Ref Line( refLineValue, "Solid", "Black", "", 1 );
)
)
);
);
Aquí hay un script que primero crea las 2 tablas de datos que mostró en su primera entrada, seguido del código que copia los límites de la tabla de límites y los aplica a cada columna de la tabla principal.
Names Default To Here( 1 );
dtMain = New Table( "Main",
Add Rows( 20 ),
New Column( "Player",
Character,
"Nominal",
Set Values(
{"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"}
)
),
New Column( "Zone",
Character,
"Nominal",
Set Values(
{"North", "North", "North", "North", "North", "North", "North", "North", "North", "North", "South",
"South", "South", "South", "South", "South", "South", "South", "South", "South"}
)
),
New Column( "Badminton",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [2, 3, 4, 5, 2, 4, 4, 4, 9, 5, 1, 2, 4, 3, 6, 2, 5, 6, 7, 6] )
),
New Column( "Table Tennis",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [2, 6, 6, 2, 5, 5, 3, 5, 7, 0, 3, 4, 7, 6, 4, 2, 8, 5, 2, 4] )
),
New Column( "Lawn Tennis",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [3, 3, 5, 2, 6, 6, 6, 2, 6, 5, 7, 7, 8, 3, 5, 2, 6, 2, 3, 6] )
)
);
dtLimits = New Table( "Limits",
Add Rows( 3 ),
New Column( "Game",
Character,
"Nominal",
Set Values( {"Badminton", "Table Tennis", "Lawn Tennis"} ),
Set Display Width( 128 )
),
New Column( "Reference Line 1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [7, 8, 6] ) ),
New Column( "Reference Line 2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3] ) )
);
// Here is the code that sets the Response Limits
For( i = 1, i <= N Rows( dtLimits ), i++,
If( Try( (Column( dtMain, (Column( dtLimits, "Game" )[i]) )) << get name, "" ) != "",
Eval(
Substitute(
Expr(
Column( dtMain, Column( dtLimits, "Game" )[i] ) << set property(
"response limits",
{Goal( Maximize ), Lower( __Low__, 1 ), Upper( __up__, 1 ), Importance( 1 ),
Show Limits( 1 )}
)
),
Expr( __Low__ ), dtLimits:Reference Line 2[i],
Expr( __Up__ ),
dtLimits:Reference Line 1[i]
)
)
)
);