ox, oy, dx 및 dy 열이 있는 데이터 테이블이 있습니다. 데모를 위해 모든 열이 Random Normal(0, 10) 공식을 사용하여 임의적이라고 가정할 수 있습니다. 진짜 문제는 좌표 목록이 있는 네트워크입니다.
(ox, oy)와 (dx, dy) 사이에 선을 그리고 싶습니다. 그래프 빌더나 그래프 상자를 사용하여 이 작업을 수행할 수 있습니다(아래 예). 그러나 모든 상호 작용에서 JMP는 내 시각화를 매우 느리게 만드는 선을 다시 그립니다(데이터 테이블에 10,000개 이상의 행이 있음). 그래프 스크립트의 시작점 및 대상 좌표에 작은 임의의 부분을 추가하고 상호 작용이 발생하는 즉시(예: Grabber 도구 사용 및 캔버스 드래그, 축 조정, 그래프 크기 조정, 창 크기 조정) 테스트했습니다. 라인이 바뀝니다. JMP가 그래프 업데이트 및 스크립트 재실행을 중지하는 방법이 있습니까?
Graph Builder(나는 이 플랫폼을 사용하는 것을 선호함) 또는 Graph Box에서 방법을 찾을 수 없습니다. 나는 찾았다
<< Graph Updating( Per Mouse Up );
메시지이지만 두 가지 옵션만 있습니다. 내가 말할 수있는 한 "업데이트하지 않음"옵션이 없습니다. 또한 그 메시지는 어쨌든 Graph Box에서 작동하지 않는다고 생각합니다.
다음은 선을 그릴 수 있지만 모든 상호 작용으로 선이 업데이트되는 최소한의 그래프 상자 예입니다.
New Window( "Example",
Graph Box(
Frame Size( 300, 300 ),
Pen Color( "Blue" );
o_x = :ox << Get Values();
o_y = :oy << Get Values();
d_x = :dx << Get Values();
d_y = :dy << Get Values();
For( i=1, i<=N Items(o_x), i++,
origin = Eval List({o_x[i]*Random Normal( 1, 0.1 ), o_y[i]*Random Normal( 1, 0.1 )});
destination = Eval List({d_x[i]*Random Normal( 1, 0.1 ), d_y[i]*Random Normal( 1, 0.1 )});
Line(origin, destination);
);
);
);참고로 저는 그래프 상자 스크립트에 Random Normal만 추가하여 선이 다시 계산되는지 확인했습니다. 실제 문제에는 고정 좌표가 있습니다.
보너스 질문: 그래프 상자가 구성된 후 선을 추가하는 방법이 있습니까? 예제에서 찾을 수 없었습니다. 나는 그들이 모든 마우스 상호 작용으로 업데이트되지 않을 것이라고 이론화했지만 테스트할 수는 없었습니다.
문제는 변경이 있을 때마다 프레임 상자가 자동으로 업데이트된다는 점인 것 같아서 렌더링 전에 모든 변경을 하는 것이 가장 좋습니다. 또한 For() 함수를 사용하여 명시적으로 반복하는 대신 속도를 위해 작업을 벡터화할 수도 있습니다. 그래픽 세그먼트도 몇 가지 장점을 제공하지만 현재로서는 제대로 문서화되지 않았습니다.
이 접근 방식을 참조하십시오.
Names Default to Here( 1 );
// origin
o_x = :ox << Get As Matrix;
o_y = :oy << Get As Matrix;
// destination
d_x = :dx << Get As Matrix;
d_y = :dy << Get As Matrix;
n = N Items( o_x );
// vectorize for line segments
seg = (o_x :*</img> J( n, 1, Random Normal( 1, 0.1 ))) || (o_y f:* J( n, 1, Random Normal( 1, 0.1 ))) ||
(d_x :*</img> J( n, 1, Random Normal( 1, 0.1 ))) || (d_y f:* J( n, 1, Random Normal( 1, 0.1 )));
// plot segments
New Window( "Example",
gb = Graph Box(
Frame Size( 300, 300 ),
Pen Color( "Blue" );
Line Seg( seg );
)
);
// later, update seg, then send gb << Reshow message to graph box
(나는 당신의 데이터 테이블이 없어서 그것을 테스트할 수 없었지만 여전히 접근 방식을 설명해야 합니다.)