Okay, ich habe eine sehr spezifische Anfrage und hoffentlich wird es euch nicht zu sehr stören. Ich bin sehr neu bei JMP. Ich hätte gerne etwas Hilfe, um das herauszufinden. Anscheinend sollte es relativ einfach sein (relativ, wenn ich es sehr leicht hätte, hätte ich es vielleicht schon herausgefunden;).
Aufgabe: Excel-Dokument öffnen und Daten importieren (Standardeinstellungen funktionieren für diese bestimmte Datenzeichenfolge gut, zumindest für das, was ich brauche)
- Eine Spalte ist Time [sec], der Rest sind Daten in diesem Zeitraum. Im Moment nur mit Daten in den Spalten Ch1-Ch8 besorgt. Und Zeit natürlich, aber das ist nur für die Grafik.
- Sobald die Daten importiert sind, möchte ich eine Aufforderung haben, nach den Spalten (CH1-CH8) zu fragen. Anschließend wird für jeden Kanal eine Aufforderung abgefragt, wie der chemische Offset (Skala) in diesem Fall nur als durch den Jargonoffset bezeichnet wird. Spaltenwert mal spezifische Zahl) ist für die betreffende Chemikalie oder es gibt sogar nur ein Menü, um Chemikalie aus einer voreingestellten Liste auszuwählen.
- Sobald dies abgeschlossen ist, sollte es ziemlich einfach sein, die Grafik mit den berechneten 'Versätzen' sowie den Spitzenwerten im Diagramm anzuzeigen.
Bekannte Hangups;
- Der Import mehrerer Dateien aus Excel scheint nicht so intelligent zu sein wie der Einzelimport. Wenn wir angeben können, welche Spalten sich beim Importvorgang befinden, kann dies eliminiert werden, da wir wissen, dass time [sec] und CH1-CH8 numerisch / kontinuierlich sind.
Wie ich schon sagte, scheint es vernünftig zu sein, ich würde meinen Kopf ein wenig gegen den Kopf schlagen, aber gestern wäre es wirklich nützlich gewesen. Hoffentlich wird jemand bereit sein, die Dinge für zukünftige Anforderungen zu beschleunigen, danke im Voraus !
Vielen Dank! Das ist sehr praktikabel, es dauerte nur ein paar Minuten, um herauszufinden, was ich bearbeiten musste, um es zu tun, was ich wollte. Möglicherweise könnte ich es effizienter machen, sobald ich das Skript besser verstanden habe, aber das tut es auf jeden Fall was ich will es tun
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 ),
)
);
Es gibt eine Reihe von Rohdatenzeilen, die für das, was wir mit den Daten machen, nicht notwendig ist. Daher werden die neuen modifizierten Zeilen viel später in die Tabelle eingefügt, aber es ist für den Moment einfach genug, damit zu arbeiten, vielen Dank!
Damit sollten Sie anfangen. Hier sind einige fortgeschrittene Techniken, insbesondere die dynamische Erstellung des Diagramms.
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 ist was ich habe, und ja, Ch1 etc ... ist der tatsächliche Spaltenname. Ich habe die Registerkarte Maßstab / Versatz entdeckt und kann sie für die manuelle Eingabe in den chemischen Versatz verwenden, aber ich versuche, den Prozess zu automatisieren, so dass dies nicht für jede Chemikalie in jedem einzelnen Kanal erforderlich ist.
Der Grafiktyp ist eine Linie, die Zeit ist der X-Wert und der Kanal bzw. die Kanäle sind der Y-Wert.

Ich versuche herauszufinden, wie man es mit JSL automatisieren kann, aber ich bin noch recht neu mit der Benutzeroberfläche und einige Dinge, die intuitiv sein könnten, klicken noch nicht. Die Excel-Datei wird automatisch aus einem anderen Programm generiert und hat daher immer dasselbe Format. Es sollte nicht sehr schwierig sein, ein Skript zu schreiben, um nach den angegebenen Spalten zu suchen. Ich bin einfach noch nicht mit der Skriptsprache vertraut. Ich hoffe, dass vielleicht jemand schon ein Skript hat, das etwas Ähnliches macht, das ich an meine Bedürfnisse anpassen kann. Ich kann ziemlich praktisch sein, wenn ich ein Skript auseinander wähle und es so machen soll, wie ich es will.
Danke für die Information!
Damion,
Sie haben nicht erwähnt, welche JMP-Version Sie verwenden und welche JMP-Grafik / Plattform Sie verwenden möchten. Speichert auch die erste Zeile in jeder dieser Spalten den chemischen Namen oder sind die Namen nur Ch1, Ch2, ..., Ch8
JMP verfügt über eine recht standardisierte Schnittstelle für die Grafiken und Analysen. Ich gehe davon aus, dass Sie Fit Y durch X verwenden könnten, wobei Y die Chemikalien (Ch1-Ch8) und X die Zeit [Sekunden] ist. Bevor Sie jede Chemikalie hinzufügen, klicken Sie mit der rechten Maustaste und wählen Sie Transformieren> Skalierungsoffset siehe den Screenshot. Verwenden Sie 1 für den Multiplikator und geben Sie den Versatz an. Verwenden Sie die transformierte Chemikalie für Y.

Dies ist keine automatische Aufforderung, sondern eine Methode, um dies über die Benutzeroberfläche (UI) zu tun.
Selbstverständlich können Sie Ihre Aufgaben mit JMP Scripting Language (JSL) automatisieren und an Ihre speziellen Anforderungen anpassen.
In Bezug auf Ihre Anforderung, nur ausgewählte Excel-Spalten einzulesen, gibt es mehrere Methoden, dies zu tun. Dies hängt jedoch davon ab, wie Ihre Excel-Datei eingerichtet wird, oder ob Sie über eine ODBC-Verbindung verfügen, um Excel als Datenbank zu lesen usw. Wenn Sie eine Dummy-Excel-Tabelle bereitstellen können, erhalten Sie möglicherweise eine spezifischere Antwort.