De acuerdo, tengo una solicitud muy específica y espero que no les moleste demasiado, soy muy nuevo en JMP, así que me gustaría algo de ayuda para resolver esto. Parece que debería ser relativamente fácil (relativo porque si fuera muy fácil podría haberlo resuelto ya).
Tarea: abra un documento de Excel e importe datos (la configuración predeterminada funciona bien para esta cadena de datos en particular, al menos para lo que necesito)
- Una columna es Tiempo [seg], el resto son datos en ese período de tiempo. Solo preocupado por el momento con datos en las columnas Ch1-Ch8. Y el tiempo, por supuesto, pero eso es sólo para el gráfico.
- Una vez que se importen los datos, me gustaría que me preguntaran qué columnas representar (CH1-CH8) seguidas de un mensaje para cada canal que pregunte cuál es la compensación química (escala en este caso, que se conoce como compensación por jerga). El valor específico de la columna por el número específico es para el producto químico en cuestión, o incluso simplemente tiene un menú para seleccionar producto químico de una lista preestablecida.
- Una vez que se haya completado, debería ser bastante simple hacer que el gráfico muestre los canales especificados con el 'desplazamiento' calculado, así como los valores máximos.
Colgantes conocidos;
- La importación de múltiples archivos desde Excel parece no ser tan inteligente como las importaciones individuales. Si podemos especificar qué columnas están en el proceso de importación, esto podría eliminarse, ya que sabemos que el tiempo [seg] y CH1-CH8 son numéricos / continuos.
Como dije, parece que debería ser razonable, me golpeé la cabeza por un rato, pero ayer hubiera sido útil, así que espero que alguien esté dispuesto a ayudar a acelerar las necesidades futuras, gracias de antemano !
¡Gracias! Eso es muy práctico, solo me tomó unos minutos descubrir qué necesitaba editar para que hiciera lo que quiero, posiblemente pueda hacerlo más eficiente en algún momento una vez que entienda mejor el script, pero esto ciertamente lo hace. ¡Qué quiero que haga!
dt = Open();
col_list = dt << get column names( string );
Remove From( col_list, 1 ); // Remove time[sec] from list
cols_to_plot = {};
offset_list = {};
offset_cols = {};
// Define the graph builder commands in an expression for use by the OK button
graph_expr = Expr(
For( i = 1, i <= N Items( cols_to_plot ), i++,
new_name = cols_to_plot[i] || "-Offset";
Insert Into( offset_cols, new_name );
dt << New Column( new_name,
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( As Column( dt, cols_to_plot[i] ) * offset_list[i] )
);
);
// Now for the graph - build a text string and then execute it
gb_text = "\[gb = graph builder(
show control panel(0),
variables(
X( :Name( "Time[sec]" ) ),]\";
elements_txt = " ),
Elements( Line( X, ";
For( i = 1, i <= N Items( cols_to_plot ), i++,
If( i == 1,
// then
gb_text = gb_text || Eval Insert( "\!N\[ Y( :Name( "^offset_cols[i]^" ) ), ]\" )
,
// else
gb_text = gb_text || Eval Insert( "\!N\[ Y( :Name( "^offset_cols[i]^" ), Position( 1 ) ),]\" )
);
elements_txt = elements_txt || Eval Insert( "Y ( ^i^ ), " );
);
elements_txt = elements_txt || "Legend( 7 ) ) ,";
gb_text = gb_text || elements_txt || ") )";
Eval( Parse( gb_text ) );
);
nw = New Window( "Graph Chemicals",
Panel Box( "Select channels to graph",
Lineup Box( N Col( 2 ),
Text Box( "Column" ),
Text Box( "Offset" ),
cb1 = Check Box( "Ch1" ),
ch1_neb = Number Edit Box(),
cb2 = Check Box( "Ch2" ),
ch2_neb = Number Edit Box(),
cb3 = Check Box( "Ch3" ),
ch3_neb = Number Edit Box(),
cb4 = Check Box( "Ch4" ),
ch4_neb = Number Edit Box(),
cb5 = Check Box( "Ch5" ),
ch5_neb = Number Edit Box(),
cb6 = Check Box( "Ch6" ),
ch6_neb = Number Edit Box(),
cb7 = Check Box( "Ch7" ),
ch7_neb = Number Edit Box(),
cb8 = Check Box( "Ch8" ),
ch8_neb = Number Edit Box(),
),
),
Panel Box( "Actions",
H List Box(
okb = Button Box( "OK",
If( cb1 << get( 1 ),
Insert Into( cols_to_plot, col_list[5] );
offset_value = ch1_neb << get;
Insert Into( offset_list, offset_value );
);
If( cb2 << get( 1 ),
Insert Into( cols_to_plot, col_list[6] );
offset_value = ch2_neb << get;
Insert Into( offset_list, offset_value );
);
If( cb3 << get( 1 ),
Insert Into( cols_to_plot, col_list[7] );
offset_value = ch3_neb << get;
Insert Into( offset_list, offset_value );
);
If( cb4 << get( 1 ),
Insert Into( cols_to_plot, col_list[8] );
offset_value = ch4_neb << get;
Insert Into( offset_list, offset_value );
);
If( cb5 << get( 1 ),
Insert Into( cols_to_plot, col_list[9] );
offset_value = ch5_neb << get;
Insert Into( offset_list, offset_value );
);
If( cb6 << get( 1 ),
Insert Into( cols_to_plot, col_list[10] );
offset_value = ch6_neb << get;
Insert Into( offset_list, offset_value );
);
If( cb7 << get( 1 ),
Insert Into( cols_to_plot, col_list[11] );
offset_value = ch7_neb << get;
Insert Into( offset_list, offset_value );
);
If( cb8 << get( 1 ),
Insert Into( cols_to_plot, col_list[12] );
offset_value = ch8_neb << get;
Insert Into( offset_list, offset_value );
);
graph_expr;
nw << close window;
),
canb = Button Box( "Cancel", nw << close window ),
)
),
);
// Pre-check checkboxes if column exists
For( i = 1, i <= N Items( col_list ), i++,
If(
col_list[i] == "Ch1", cb1 << set( 1, 1 ),
col_list[i] == "Ch2", cb2 << set( 1, 1 ),
col_list[i] == "Ch3", cb3 << set( 1, 1 ),
col_list[i] == "Ch4", cb4 << set( 1, 1 ),
col_list[i] == "Ch5", cb4 << set( 1, 1 ),
col_list[i] == "Ch6", cb4 << set( 1, 1 ),
col_list[i] == "Ch7", cb4 << set( 1, 1 ),
col_list[i] == "Ch8", cb4 << set( 1, 1 ),
)
);
Hay un montón de líneas de datos en bruto que no son necesarias para lo que hacemos con los datos, por lo que coloca las nuevas líneas modificadas mucho más adelante en la hoja de cálculo, pero será bastante fácil trabajar con ellas por ahora, ¡muchas gracias!
Esto debería empezar. Algunas técnicas avanzadas aquí, especialmente la creación dinámica de la gráfica.
dt = New Table( "chemical", Add Rows( 10 ),
New Column( "Time[sec]", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ) ),
New Column( "Ch1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values(
[0.405479144770652, 0.96118725137785, 0.184666735585779,
0.0779315158724785, 0.27096574800089, 0.274306696141139,
0.499865497928113, 0.645765431923792, 0.850604736013338,
0.375170755432919] ) ),
New Column( "Ch2", Numeric, "Continuous", Format( "Best", 12 ),
Set Values(
[-1.49768617758238, 0.627178362585814, 0.444456848007608,
0.23009213128918, 0.191183820733896, -0.871513987372999,
0.117414289530274, 0.673226666360769, 2.21437748894808,
-0.757598019757669] ) ),
New Column( "Ch3", Numeric, "Continuous", Format( "Best", 12 ),
Set Values(
[0.58753531659022, 0.722538525937125, 0.305761067429557,
0.53906583529897, 0.635318850399926, 0.701098019722849,
0.746448054211214, 0.526889791944995, 0.749249363318086,
0.959693510085344] ) )
);
col_list = dt << get column names(string);
remove from(col_list, 1); // Remove time[sec] from list
cols_to_plot = {};
offset_list = {};
offset_cols = {};
// Define the graph builder commands in an expression for use by the OK button
graph_expr = expr(
for (i = 1, i <= nitems(cols_to_plot), i++,
new_name = cols_to_plot[i] || "-Offset";
insertinto(offset_cols, new_name);
dt << new column(new_name, Numeric, "Continuous", Format( "Best", 12 ),
Formula( as column(dt, cols_to_plot[i]) * offset_list[i] ) );
);
// Now for the graph - build a text string and then execute it
gb_text =
"\[gb = graph builder(
show control panel(0),
variables(
X( :Name( "Time[sec]" ) ),]\";
elements_txt = " ),
Elements( Line( X, ";
for (i = 1, i <= nitems(cols_to_plot), i++,
if (i == 1,
// then
gb_text = gb_text || evalinsert("\!N\[ Y( :Name( "^offset_cols[i]^" ) ), ]\");
,
// else
gb_text = gb_text || evalinsert("\!N\[ Y( :Name( "^offset_cols[i]^" ), Position( 1 ) ),]\");
);
elements_txt = elements_txt || evalinsert("Y ( ^i^ ), ");
);
elements_txt = elements_txt || "Legend( 7 ) ) ,";
gb_text = gb_text || elements_txt || ") )";
eval(parse(gb_text));
);
nw = new window("Graph Chemicals",
panel box("Select channels to graph",
lineup box(ncol(2),
text box("Column"), text box("Offset"),
cb1 = checkbox("Ch1"), ch1_neb = number edit box(),
cb2 = checkbox("Ch2"), ch2_neb = number edit box(),
cb3 = checkbox("Ch3"), ch3_neb = number edit box(),
cb4 = checkbox("Ch4"), ch4_neb = number edit box(),
),
),
panelbox("Actions",
hlistbox(
okb = button box("OK",
if (cb1 << get(1),
insertinto(cols_to_plot, col_list[1]);
offset_value = ch1_neb << get;
insertinto(offset_list, offset_value);
);
if (cb2 << get(1),
insertinto(cols_to_plot, col_list[2]);
offset_value = ch2_neb << get;
insertinto(offset_list, offset_value);
);
if (cb3 << get(1),
insertinto(cols_to_plot, col_list[3]);
offset_value = ch3_neb << get;
insertinto(offset_list, offset_value);
);
if (cb4 << get(1),
insertinto(cols_to_plot, col_list[4]);
offset_value = ch4_neb << get;
insertinto(offset_list, offset_value);
);
graph_expr;
nw << close window;
),
canb = button box("Cancel", nw << close window;
),
)
),
);
// Pre-check checkboxes if column exists
for (i = 1, i <= nitems(col_list), i++,
if (col_list[i] == "Ch1", cb1 << set(1, 1),
col_list[i] == "Ch2", cb2 << set(1, 1),
col_list[i] == "Ch3", cb3 << set(1, 1),
col_list[i] == "Ch4", cb4 << set(1, 1),
);
);
JMP 14 es lo que tengo, y sí, Ch1, etc ... es el nombre real de la columna. Descubrí la pestaña de escala / desplazamiento y puedo usar eso para ingresar manualmente el químico compensado, pero estoy tratando de automatizar el proceso para que no sea necesario hacerlo cada vez que se produzca cada químico en cada canal individual.
El tipo de gráfico es una línea, la hora es el valor de X y los canales son el valor de Y.

Estoy tratando de descubrir cómo automatizarlo usando JSL, pero aún soy realmente nuevo con la interfaz y algunas cosas que podrían ser intuitivas aún no hacen clic. El archivo de Excel se genera automáticamente desde otro programa, por lo que siempre está en el mismo formato. No debería ser terriblemente difícil hacer un script para buscar las columnas especificadas, simplemente no estoy familiarizado con el lenguaje de scripting todavía. Espero que quizás alguien ya tenga un script que haga algo similar que pueda editar según mis necesidades, puedo ser bastante hábil para seleccionar un script y hacer que haga lo que quiero, pero no tan bueno al escribir uno desde cero.
¡Gracias por la información!
Damion,
No mencionó qué versión de JMP está utilizando y qué gráfico / plataforma JMP usaría. También la primera fila en cada una de estas columnas almacena el nombre químico o son los nombres solo Ch1, Ch2, ..., Ch8
JMP tiene una interfaz bastante estándar para los gráficos y análisis. Supongo que puedes usar Fit Y por X, donde Y son los productos químicos (Ch1-Ch8) y X es Tiempo [seg]. Antes de agregar cada producto químico, haga clic derecho y seleccione Transformar> Desplazamiento de escala , ver la captura de pantalla. Use 1 para el multiplicador, y especifique el desplazamiento. Usa el producto químico transformado para Y.

Esto no es una solicitud automática, sino un método para hacerlo a través de la interfaz de usuario (UI).
Por supuesto, su tarea se puede automatizar y adaptar a sus necesidades específicas utilizando el lenguaje de secuencias de comandos JMP (JMP).
Con respecto a su solicitud de leer solo las columnas seleccionadas de Excel, existen varios métodos para hacerlo, pero depende de cómo esté configurado su archivo de Excel, o si tiene una conexión ODBC para leer Excel como una base de datos, etc. Si puede proporcionar una hoja de Excel ficticia, puede obtener una respuesta más específica.