좋아요. 매우 구체적인 요청이 있습니다. JMP에 너무 익숙하지 않으므로 걱정하지 않으셔도됩니다. JMP에 익숙하지 않으므로이 문제를 해결하는 데 도움이되고 싶습니다. 그것이 상대적으로 쉬워야하는 것처럼 보입니다. (상대적으로 쉽다면 이미 알아낼 수 있었을 것입니다.)
작업 : Excel 문서를 열고 데이터를 가져옵니다 (기본 설정은이 특정 데이터 문자열에 대해 잘 작동합니다.
- 한 열은 시간 [초]이고 나머지는 해당 시간 프레임의 데이터입니다. Ch1-Ch8 열에있는 데이터에만 관심이 있습니다. 그리고 시간은 물론입니다. 그러나 그것은 그래프를위한 것입니다.
- 일단 데이터가 임포트되면, 각 채널에 대한 화학적 오프셋 (이 경우에는 척도, 전문 용어로는 오프셋이라고 부름)을 묻는 프롬프트 다음에 그래프 (CH1-CH8)로 표시 할 열을 묻습니다. 열 값과 특정 번호의 곱)은 해당 화학 물질에 대한 것이거나 사전 설정 목록에서 화학 물질을 선택할 수있는 메뉴가 있습니다.
- 일단 그것이 끝나면 피크 값뿐만 아니라 계산 된 'offset'으로 지정된 채널을 표시하는 그래프를 얻는 것이 매우 간단해야합니다.
알려진 hangups;
- Excel에서 여러 파일을 가져 오는 것이 개별 가져 오기만큼 지능적이지 않은 것처럼 보입니다. 가져 오기 프로세스에서 특정 열이 무엇인지 지정할 수 있으면 시간 [초]과 CH1-CH8이 숫자 / 연속이라는 것을 알기 때문에 제거 될 수 있습니다.
내가 말했듯이, 그것이 합리적이어야하는 것 같아서, 나는 그것에 대해 머리를 때려 눕힐 것이다. 그러나 어제는 정말 유용했을 것이다. 그래서 누군가가 미래의 필요를 위해 신속하게 도움을 줄 수 있기를 바랍니다. 미리 감사드립니다. !
감사! 그것은 매우 실행 가능하며, 내가 원하는 것을 할 수 있도록 편집해야하는 것을 알아 내는데 단지 몇 분이 걸렸을뿐입니다. 가능한 한 스크립트를 더 잘 이해하면 어느 시점에서 더 효율적으로 만들 수 있습니다. 나는 그것을하기를 원한다!
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 ),
)
);
데이터로 수행하는 작업에는 불필요한 원시 데이터 행이 많으므로 새 수정 된 행을 스프레드 시트의 훨씬 뒤에 배치합니다. 그러나 지금 당장은 쉽게 작업 할 수 있습니다. 대단히 감사합니다!
이렇게하면 시작할 수 있습니다. 일부 고급 기술, 특히 그래프의 동적 생성.
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는 제가 가지고있는 것입니다. 예, Ch1 등 ... 실제 열 이름입니다. 스케일 / 오프셋 탭을 발견 했으므로 수동으로 화학 오프셋을 입력하는 데 사용할 수 있습니다. 그러나 각 개별 채널의 모든 화학 물질마다 매번 수행 할 필요가 없도록 프로세스를 자동화하려고합니다.
그래프 유형은 라인이며, 시간은 X 값이며 채널은 Y 값입니다.

JSL을 사용하여 자동화하는 방법을 알아 내려고했지만 인터페이스가 아직 완전히 새롭고 직관적 일 수있는 몇 가지 사항은 아직 클릭하지 않았습니다. Excel 파일은 다른 프로그램에서 자동으로 생성되므로 항상 같은 형식입니다. 지정된 열을 찾기 위해 스크립트를 작성하는 것은 대단히 어렵지 않아야하며 아직 스크립팅 언어에 익숙하지 않습니다. 누군가가 이미 내 필요에 맞게 편집 할 수있는 비슷한 스크립트를 가지고 있을지도 모르기 때문에 스크립트를 따로 따로 가져와 원하는대로 만들 수 있습니다. 처음부터 스크립트를 작성하는 데 그다지 좋지는 않습니다.
정보 주셔서 감사합니다!
Damion,
사용중인 JMP 버전과 사용하려는 JMP 그래프 / 플랫폼에 대해서는 언급하지 않았습니다. 또한이 각 열의 첫 번째 행은 화학 이름을 저장하거나 Ch1, Ch2, ..., Ch8만의 이름입니다
JMP에는 그래프와 분석을위한 표준 인터페이스가 있습니다. X가 Y에 맞추기를 사용한다고 가정합니다. 여기서 Y는 화학 물질 (Ch1-Ch8)이고 X는 Time [sec]입니다. 각 화학 물질을 추가하기 전에 마우스 오른쪽 버튼을 클릭하고 변형> 스케일 오프셋 , 스크린 샷을 참조하십시오. 곱셈기에 1을 사용하고 오프셋을 지정하십시오. Y에 대해 변형 된 화학 물질을 사용하십시오.

이것은 자동 프롬프트가 아니며 사용자 인터페이스 (UI)를 통해이를 수행하는 방법입니다.
물론 JMP (JMP Scripting Language)를 사용하여 작업을 자동화하고 필요에 맞게 조정할 수 있습니다.
선택한 Excel 열에 대한 읽기 요청과 관련하여 여러 가지 방법이 있지만 Excel 파일을 설정하는 방법이나 데이터베이스를 Excel로 읽는 ODBC 연결이있는 경우 등에 따라 다릅니다. 더미 엑셀 시트를 제공 할 수 있다면보다 구체적인 응답을 얻을 수 있습니다.