JSL: 열을 반복하고, 그래프 빌더 보고서를 생성하고, 각각을 JPG 파일로 저장하는 방법안녕하세요,
41개의 변수를 포함하는 데이터 세트가 있습니다. 예를 들어 40개의 상자 도표 또는 지터 도표를 만들려면 처음 40개를 마지막 항목에 대해 각각 도표화해야 합니다.
그래프 생성 메뉴를 통해 모든 기능을 갖춘 멋진 플롯을 생성하는 것은 쉽고 재미있습니다. 나는 내가 한 일의 스크립트를 저장하는 방법을 알고 있지만, 각 반복을 다른 변수로 가져와 원래 그래프 코드에서 바꾸는 루프를 작성하는 방법은 모릅니다. 즉, 20줄의 코드가 있는 경우 동일한 코드를 계속해서 실행하고 종속 변수를 정의하는 위치만 변경하는 루프를 원합니다. 또한 결과를 표시할 수 있는 좋은 방법이 필요하므로(40개의 창은 실용적이지 않음) 다음 반복으로 이동하기 전에 각 항목을 JPG로 저장해야겠다고 생각했습니다. JMP로 이것이 가능합니까?
감사합니다 !
답장: JSL 루프다음 예에서는 열 이름 목록을 문자열로 얻는 방법을 보여줍니다.For 루프는 첫 번째 열이 X로 사용되기 때문에 목록의 두 번째 열부터 시작하는 보이지 않는 그래프 빌더를 생성합니다.(원본 게시물은 목록의 첫 번째 열에서 시작하고 목록의 마지막 열 앞에서 중지하도록 이를 조정해야 합니다.) 각 그래프 빌더 보고서는 파일 이름에 열 이름이 포함된 JPG 파일로 저장됩니다.마지막으로 데이터 테이블과 보이지 않는 보고서가 닫힙니다.
/* 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 );
도움이 되었기를 바랍니다!
JSL 루프안녕,
도와주셔서 감사합니다. 불행하게도 저는 아직 JSL에 대해 충분히 익숙하지 않습니다. (일을 쉬면서 깊이 들어갈 것입니다.) 괄호와 그 모든 것에 문제가 있어서 귀하의 제안이 효과가 없었을 것입니다. 잘못된 곳에 표지판이 하나 있었어요.
내 원래 코드는 다음과 같습니다
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 )} ) )
);
루프로 포장하는 데 도움을 주시겠습니까?
건배!
JSL 루프안녕!당신이 하고 싶은 일은 꽤 쉽습니다.
먼저 스크립트에서 현재 데이터 테이블을 정의하려고 합니다.
cd = Current Data Table();
이제 열 이름 목록을 가져옵니다.
column_names = cd << Get Column Names;
이제 다음 부분을 수행하는 방법은 여러 가지가 있지만 이것이 가장 쉬운 방법이라고 생각합니다.최종적으로 구문 분석하고 평가할 텍스트 문자열을 시작하고 싶을 것입니다.첫 번째 부분은 새 창을 만드는 것입니다.
nw = "New Window(\"Graphs\",
randomname = V List Box(";
이제 하나의 사소한 변경으로 사용자 정의 코드를 삽입하는 루프를 작성할 수 있습니다.여러분이 JMP 'for' 루프를 사용하는 방법을 알고 있다고 가정하겠습니다. 테이블의 마지막 열을 제외한 모든 항목을 반복하겠습니다.
for(i=1,i<=length(column_names)-1,i++,
nw = nw || "PUT YOUR CUSTOM CODE HERE*" || ",";
);
*종속 변수를 정의하는 사용자 정의 코드에서 이를 제거하고 다음으로 바꿉니다.
:Name(\"" || column_name || "\")
이렇게 하면 작성한 사용자 정의 스크립트 내에 있는 각 종속 변수의 텍스트 이름을 붙여넣는 것입니다.
마지막으로, 이전에 시작한 새 창을 마무리해야 합니다. 첫 번째 줄은 새 창을 만들기 위한 코드 작성을 마치고, 두 번째 줄은 먼저 텍스트를 구문 분석하여 코드로 만든 다음 nw에 포함된 코드를 평가합니다.
nw = nw || "));";
eval(parse(nw));
그러면 됩니다. 질문이 있거나 구체적인 도움이 필요하면 알려주세요!