JSL: cómo recorrer columnas, generar un informe de Graph Builder y guardar cada una como un archivo JPGHola,
Tengo un conjunto de datos que contiene 41 variables. Necesito trazar cada uno de los primeros 40 contra el último, por ejemplo, para hacer 40 diagramas de caja o diagramas de fluctuación.
Crear un buen gráfico con todas las funciones a través del menú de creación de gráficos es fácil e incluso divertido. Sé cómo guardar el script de lo que hice, pero lo que no sé es cómo escribir un bucle que tome cada iteración con otra variable y la reemplace en mi código gráfico original. En otras palabras, si tengo 20 líneas de código, quiero un bucle que ejecute el mismo código una y otra vez y cambie solo el lugar donde defino la variable dependiente. Además, necesito una buena forma de mostrar los resultados (40 ventanas no son prácticas), así que pensé en guardar cada una como JPG antes de pasar a la siguiente iteración. ¿Es esto posible con JMP?
Gracias !
Re: Bucle JSLEl siguiente ejemplo muestra cómo obtener una lista de nombres de columnas como cadenas de caracteres.El ciclo For genera un generador de gráficos invisible que comienza con la segunda columna de la lista porque la primera se usa como la X.(La publicación original tendría que ajustarlos para comenzar con la primera columna de la lista y detenerse antes de la última columna de la lista). Cada informe de Graph Builder se guarda como un archivo JPG donde el nombre de la columna se incluye en el nombre del archivo.Finalmente, se cierran la tabla de datos y los informes invisibles.
/* Open a sample data table */
dt = Open( "$SAMPLE_DATA\Fitness.jmp" );
/* Obtain a list of numeric/continuous column names as strings */
colList = dt << Get Column Names( Continuous, String );
/* Loop through the list to generate the desired Graph Builder
and save the report as a JPEG file */
For( i = 2, i <= Nitems( colList ), i++,
gb = dt << Graph Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables(
X( :Age ),
Y( Column( dt, colList[i] ) ),
Color( :Age )
),
Elements(
Points(
X,
Y,
Legend( 3 ),
Summary Statistic( "Mean" ),
Error Bars( "Confidence Interval" )
)
),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Marker Size( 5 )}
)
),
Invisible
);
gb << Save Picture( "E:\Trash\Graph Builder_" || colList[i] ||".jpg", JPEG );
);
/* Close table and all invisible reports */
Close( dt, No Save );
¡Espero que ayude!
Bucle JSLHola,
gracias por tu intento de ayudar. Desafortunadamente, todavía no estoy lo suficientemente familiarizado con JSL (cuando tenga un descanso del trabajo lo profundizaré), y tuve problemas con los corchetes y todo eso, por lo que su sugerencia no funcionó, probablemente tenía un letrero en el lugar equivocado.
Mi código original es:
Graph Builder(
Size( 880, 750 ),
Show Control Panel( 0 ),
Variables(
X( :Cutoff, Size( 0, 21 ) ),
Y( :S1, Size( 0, 22 ) ),
Color( :Cutoff )
),
Elements(
Points( X, Y, Color, Legend( 1 ), Jitter( 1 ) ),
Line(
X,
Y,
Color,
Legend( 2 ),
Row order( 0 ),
Error Bars( "Confidence Interval" ),
Summary Statistic( "Mean" )
)
),
SendToReport( Dispatch( {}, "Graph Builder", FrameBox, {Marker Size( 5 )} ) )
);
¿Puedes ayudarme a envolverlo con el lazo?
¡Salud!
Bucle JSL¡Hola!Lo que quieres hacer es bastante fácil.
Primero, en su script querrá definir la tabla de datos actual:
cd = Current Data Table();
Ahora, obtenga la lista de nombres de columna:
column_names = cd << Get Column Names;
Ahora, hay varias formas de hacer la siguiente parte, pero creo que esta es la más fácil.Querrá comenzar una cadena de texto que eventualmente analizaremos y evaluaremos.La primera parte es crear una nueva ventana.
nw = "New Window(\"Graphs\",
randomname = V List Box(";
Ahora podemos escribir el ciclo que insertará su código personalizado con una alteración menor.Asumiré que sabe cómo usar un bucle JMP 'for'; solo voy a iterar sobre todas menos la última columna de la tabla.
for(i=1,i<=length(column_names)-1,i++,
nw = nw || "PUT YOUR CUSTOM CODE HERE*" || ",";
);
*En su código personalizado, donde define la variable dependiente, elimínela y reemplácela con
:Name(\"" || column_name || "\")
Lo que esto hará es pegar el nombre de texto de cada variable dependiente que tenga dentro del script personalizado que haya escrito.
Finalmente, necesitamos terminar la nueva ventana que comenzamos anteriormente: la primera línea termina de escribir el código para hacer la nueva ventana, la segunda línea primero analiza el texto para convertirlo en código y luego evalúa el código contenido en nw.
nw = nw || "));";
eval(parse(nw));
Eso debería funcionar. ¡Avíseme si tiene alguna pregunta o necesita ayuda específica!