안녕하세요,
Graph Builder에 대한 스크립팅은 매우 힘든 경험이었습니다(저는 한동안 JMP 스크립팅을 해왔습니다). 직관적이지 않은 것 같고, 나에게 필요한 구체적인 도움을 찾을 수 없는 것 같습니다. 그래서 나는 백기를 흔들며 그룹에게 묻고 있습니다.
내 스크립트는 올바른 열(개수에 따라 다름)을 파악하고 두 개의 중첩된 X 수준이 모두 적절하게 포함된 그래프 빌더를 생성합니다. 문제는 내가 제공한 첫 번째 변수가 적절한 점임에도 불구하고 어떤 이유로 그래프 빌더가 다른 모든 변수에 상자 그림을 할당한다는 것입니다(내 스크립트에서는 볼 수 없음). 그래서 저는 모든 y 변수를 점으로 바꾸는 쉬운 방법을 찾고 있습니다. Elements를 통한 루프와 관련된 것으로 의심되지만 올바르게 수행하는 방법을 찾을 수 있다면 깜짝 놀랄 것입니다.
생각? 또한 Graph Builder에 대한 자세한 스크립팅에 대한 좋은 참고 자료가 있는 사람이 있습니까?
티아! 프레드
예. 나는 동의한다. 그것은 또한 그것을 배우기 위한 나의 접근 방식이었지만 다른 스크립팅에 비해 놀라울 정도로 실망스럽습니다. 더 많은 논의를 위한 무르익은 영역입니다!
도와 주셔서 감사합니다. 나는 다음과 같은 접근 방식을 취했습니다(반복을 통해... 많은 실패가 발생했습니다!).
1. 차트에 넣고 싶은 열 이름 목록이 있습니다. 목록 "a"(표시되지 않음)에 있습니다. 그것이 제가 음모를 꾸미고 싶은 것입니다.
2. 내 검색 목록과 일치하는 데이터 테이블 열에서 목록을 작성합니다. 이는 내가 플롯할 수 있는 존재하는 Y축 변수입니다.
3. 그래프 빌더를 만들고 X축을 중첩된 변수로 설정합니다. 이것은 내 모든 데이터에 공통적입니다.
4. 그런 다음 반복하여 변수를 추가합니다.
5. 그런 다음 반복하여 요소를 추가합니다.
6. 그런 다음 반복하면서 눈금선을 추가합니다. 그리고 마지막으로 제목.
4~6단계에서 단일 루프 내에서 이러한 작업을 수행하려고 하면 JMP가 계속 충돌했습니다. 이것이 내가 여기까지 온 방법이다. 스크립트는 작동하지만(사소한 기밀 정보를 가져와야 함) 빠르지는 않습니다.
내가 프로그래밍한 다른 JSL과 비교하면 이것은 다소 투박합니다. JMP 충돌이 이렇게 많이 발생한 적이 없습니다. 하지만 작동합니다.
dtname = dt << Get Name();
currentTime = Today();
timeString = "Last Updated " || Format( currentTime, "mm-dd-yyyy" ) ;
// Find columns that match the terms in list "a"
col = dt << get column names( string );
nc = N Items( col );
nsrch = N Items( a );
xxx = {};
For( j = 1, j <= nsrch, j++,
For( i = 1, i <= nc, i++,
If( Uppercase( col[i] ) == Uppercase( a[j] ),
Insert Into( xxx, col[i] ),
)
)
);
colList = xxx;
//Build Basic Chart with nested X variables, no Y variables (yet)
gb = dt << Graph Builder(
Size( 1226, 608 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Show Subtitle( 1 ),
Variables(
X( :XVar1, Combine( "Nested" ) ),
X( :XVar2, Position( 1 ), Combine( "Nested" ) ),
X( :XVar3, Position( 1 ), Combine( "Nested" ) ),
),
);
gbb = Report( gb )[Graph Builder Box( 1 )];
// I don't know why I have to break these into separate loops, but I tried not to....
// I think it's something to do with needing the "wait".
//Add Y variables.
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Variable( {colList[i], Role( "Y" )} );
If( i == 1,
chrtname = colList[i],
chrtname = chrtname || ", " || colList[i]
);
);
Wait( 1 );
//Remove existing element and replace with points.
For( i = 1, i <= N Items( colList ), i++,
gbb << Remove Element( 1, i, 1 );
gbb << Add Element( 1, i, {Type( "Points" ), X, Y} );
);
Wait( 1 );
For( i = 1, i <= N Items( colList ), i++,
gbb << Add Element( 1, i, {Type( "Line" ), X, Y} )
);
//Set Major Axes
For( i = 1, i <= N Items( colList ), i++,
gbb << Dispatch( {}, colList[i], ScaleBox, {Label Row( Show Major Grid( 1 ) )} ),
);
//Set Various Titles
gb << SendToReport( Dispatch( {}, "graph 1 title", TextEditBox, {Set Text( timeString )} ) );
gb << SendToReport( Dispatch( {}, "Graph Builder", OutlineBox, {Set Title( chrtname || " from " || dtname ), Image Export Display( Normal )} ) );
gb << SendToReport(
Dispatch(
{},
"XVar1",
ScaleBox,
{Label Row( 2, {Major Grid Line Color( 3 ), Show Major Grid( 1 )} ), Label Row( 3, {Major Grid Line Color( 5 ), Show Major Grid( 1 )} )}
)
);
);Graph Builder JSL 스크립트는 이해하기 쉽지 않습니다.내 접근 방식은 원하는 대로 그래프를 조정한 다음 빨간색 삼각형을 클릭하고 결과 스크립트를 얻는 것입니다.
그러나 동적 수의 Y 변수가 있는 경우 2개 또는 3개의 Y 변수에 대한 스크립트를 얻고 패턴에 대한 GB 스크립트를 연구할 수 있습니다.그런 다음 확장하려면 N Y 변수를 사용하면 실행할 gb 스크립트가 포함된 문자열을 동적으로 작성한 다음 eval(parse(gb_string))을 사용하여 실행할 수 있습니다.
표현식을 사용하는 한 가지 방법은 다음과 같습니다. 나는 완전한 제어권을 갖고 있고 전체 실행 표현을 한 번에 만들 수 있기 때문에 이 경우에 이 접근 방식을 좋아합니다.
Names Default to Here( 1 );
// open example data
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// a list of columns to plot in Y role was previously created somehow
col = List( :height, :weight );
nc = N Items( col );
// create expression for Variables launch argument with first column,
// using same two nested X variables
vars arg = Eval Expr(
Variables(
X( :age ),
X( :sex, Position( 1 ) ),
Y( Expr( col[1] ) )
)
);
// create expression for Points launch argument with first column
points arg = Eval Expr(
Points( X( 1 ), X( 2 ), Y( 1 ) )
);
// add remaining columns in the Y role
If( nc > 1,
For( c = 2, c <= nc, c++,
Insert Into( vars arg, Eval Expr( Y( Expr( col[c] ), Position( 1 ) ) ) );
Insert Into( points arg, Eval Expr( Y( Expr( c ) ) ) );
);
);
// finish GB launch expression
gb expr = Substitute(
Expr(
Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
vvv,
Elements( ppp )
)
),
Expr( vvv ), Name Expr( vars arg ),
Expr( ppp ), Name Expr( points arg )
);
Eval( gb expr );
나는 이 답변이 완전한 해결책이 아니라는 것을 알고 있습니다. 해결 방법을 시도하기에 충분한 정보를 제공하지 않았습니다. 또한 스스로 해결하는 방법을 배우는 것이 좋습니다. 이는 귀하에게 적합한 접근 방식을 설명하기 위한 것입니다.
Y 역할에서 여러 열을 플롯하고 있습니까, 아니면 각 열에 하나씩 여러 그래프 빌더 개체를 사용하고 있습니까?
글쎄, 약간의 해결 방법을 찾았지만 확실히 불안정합니다.
나는 결국 :
- 원하는 중첩 x 변수를 사용하여 초기 그래프를 만들고 Y 변수는 사용하지 않습니다.
- 그런 다음 루프를 실행하여 Y 변수를 추가합니다.
- 그런 다음 다른 루프를 추가하여 각 Y의 요소를 제거하고 점이 있는 각 Y에 대해 새 요소를 추가합니다.
- 그런 다음 각 Y에 그리드 선을 추가하는 또 다른 루프를 추가합니다.
거의 모든 단계 사이에는 Wait(1)이 있습니다. 처음에는 각 작업을 수행하는 각 변수에 대해 단일 루프를 시도했으며 지금까지 약 10번 정도 JMP 완료가 중단되었습니다. 위의 양식을 사용하게 된 것은 문제 해결 과정이었습니다.
따라서 작동하지만 올바르게 코딩되지 않으면 JMP가 충돌하는 것을 좋아하지 않습니다. 그리고 Graph Builder 스크립팅에 대한 확실한 참고 자료를 알려준 사람에게 감사하겠습니다. 미리 감사드립니다!프레드