상호 작용으로 그래프 업데이트 비활성화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만 추가하여 선이 다시 계산되는지 확인했습니다. 실제 문제에는 고정 좌표가 있습니다.
보너스 질문: 그래프 상자가 구성된 후 선을 추가하는 방법이 있습니까? 예제에서 찾을 수 없었습니다. 나는 그들이 모든 마우스 상호 작용으로 업데이트되지 않을 것이라고 이론화했지만 테스트할 수는 없었습니다.
제도법스크립팅Re: 상호 작용으로 그래프 업데이트 비활성화문제는 변경이 있을 때마다 프레임 상자가 자동으로 업데이트된다는 점인 것 같아서 렌더링 전에 모든 변경을 하는 것이 가장 좋습니다. 또한 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
(나는 당신의 데이터 테이블이 없어서 그것을 테스트할 수 없었지만 여전히 접근 방식을 설명해야 합니다.)
Re: 상호 작용으로 그래프 업데이트 비활성화IMHO JMP는 정말 _VERY_ 이 기능을 업데이트해야 합니다.나는 이 문제에 여러 번 부딪쳤고 아주 간단하게 유효한 해결 방법이 없습니다.JMP는 단순히 창의 크기를 스크롤/변경할 때가 아니라 무언가가 변경될 때(예: 그래프 크기) 그래픽 스크립트를 다시 실행해야 합니다.
즉, 이와 같은 작업을 수행하는 가장 빠른 방법은 아래와 같습니다.나는 SVG 경로를 만들고(내 경험상 이것은 JMP에서 복잡한 경로를 렌더링하는 가장 빠른 방법임) 경로를 재구성할지 여부를 결정하는 센티넬이 있습니다.단순히 예를 들어 경로 재구성을 강제하는 버튼을 포함했습니다.
이것이 도움이 되기를 바라지만 다른 모든 디스플레이 관리자 시스템(다중 스레드, 신호/슬롯, 콜백 등... 포함)처럼 작동하는 시스템을 제공하는 JMP 개발자가 더 좋을 것입니다.
나는 또한 이 방법을 사용하여 원하는 렌더의 이미지를 잡고 그래픽 상자의 크기를 확인하고 크기가 변경되지 않은 경우 저장된 이미지를 표시하는 것으로 사용하는 방법을 사용했습니다.이것이 JMP가 해야 하는 일이며 가능한 모든 기회에서 그래픽 스크립트를 적극적으로 실행하도록 설정되어서는 안 됩니다.그러나 JMP가 이 작업을 제대로 수행하는 데 필요한 도구를 제공하지 않기 때문에 이 방법으로 많은 운을 얻지 못했습니다.
self = New Namespace();
self:table = Current Data Table();
self:redraw = 1;
self:path = "";
self:build path = Function( {},
{Default Local},
self:path = "";
For Each Row( self:table,
self:path ||= Eval Insert( "\[M^:ox * Random Normal( 1, 0.1 )^,^oy * Random Normal( 1, 0.1)^ L^dx * Random Normal( 1, 0.1 )^,^:dy * Random Normal( 1, 0.1 )^]\" )
);
);
Eval( Eval Expr(
New Window( "Example",
<<ON close=""></ON>
Re: 상호 작용으로 그래프 업데이트 비활성화JSL에서 그런 벡터화를 할 수 있는지 몰랐습니다. 그 방법을 가르쳐 주셔서 감사합니다!
무작위 계산을 그래프 상자 밖으로 옮기면 숫자가 업데이트되지 않지만 이는 오해의 소지가 있습니다. 나는 JMP가 그래프를 다시 그리는 중임을 확신시키기 위해 무작위성을 넣었을 뿐입니다. 따라서 이 방법이 효과가 있는 동안에는 내가 하고 싶은 대로 되지 않았습니다. 무작위 계산을 그래프 상자로 가져왔을 때 모든 선은 여전히 움직이고 있었습니다. 하지만 그 과정에서 확실히 배운 것이 있습니다. 감사 해요!
또한 내 선은 연결된 경로가 아니었기 때문에 여전히 선 그리기를 반복해야 했습니다. 따라서 x 및 y 행렬의 단일 쌍을 만들고 이를 Line 또는 Line Seg에 전달할 수 없습니다.
귀하의 코드를 사용하여 내 데이터 테이블과 함께 작동하도록 했으며 아래에 있습니다. 다른 사람이 이 솔루션을 필요로 하는 경우를 대비하여 이 메시지에 표를 첨부하겠습니다.
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 );
// plot segments
New Window( "Example",
gb = Graph Box(
Frame Size( 300, 300 ),
Pen Color( "Blue" );
seg_x = (o_x :*</img> J( n, 1, Random Normal( 1, 0.1 ) )) || (d_x :*</img> J( n, 1, Random Normal( 1, 0.1 ) ));
seg_y = (o_y :*</img> J( n, 1, Random Normal( 1, 0.1 ) )) || (d_y :*</img> J( n, 1, Random Normal( 1, 0.1 ) ));
For( i=1, i<=n, i++,
Line( seg_x[i, -1], seg_y[i, -1] )
)
)
);