[그래프 작성기] 선택한 행에 마우스 오버 시 레이블을 일괄 고정합니다.여러분 모두에게,
현재 저는 JMP16을 사용하여 그래프를 생성합니다.
사진이 있는 열이 있는데, 선택한 각 지점에 사진을 고정하고 싶어서 해당 열의 "레이블 추가" 기능을 켰습니다.
하지만 제가 알아본 바로는, 점 위에 마우스 포인터를 올려놓고 '호버 레이블'이 나타날 때까지 기다린 다음, 핀 버튼을 클릭해서 하나씩 고정하는 방법밖에 없는 것 같습니다.
JSL 코드처럼 더 빠른 방법이 있을까요? 수백만 개의 행에 사진을 표시해야 합니다.
감사해요!
자동화 및 스크립팅제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정마우스 오버 시 나타나는 레이블이 필요한가요? 아니면 그래프에서 이미지를 기호로 사용할 수 있을까요? 예를 들어, Big Class Families 샘플 데이터셋을 사용하면 다음과 같습니다.

선택한 행에 대한 이미지만 표시하려면 해당 행을 선택하고 열에 '선택 항목'이라는 이름을 지정한 다음, 해당 열을 사용하여 다음과 같이 변환 열을 만들 수 있습니다.
// Open Data Table: Big Class Families.jmp
// → Data Table( "Big Class Families" )
Open( "$SAMPLE_DATA/Big Class Families.jmp" );
// Name selection in column: Use Images
Data Table( "Big Class Families" ) << Clear Select <<
Select Rows( [1, 6, 14, 15, 16] ) <<
Name Selection in Column( Column Name( "Use Images" ), Selected( 1 ) );
Graph Builder(
Transform Column( "Transform[height]", Formula( :height * :Use Images ) ),
Size( 648, 551 ),
Show Control Panel( 0 ),
Variables(
X( :weight ),
Y( :height ),
Y( :"Transform[height]"n, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ),
Points( X, Y( 2 ), Legend( 5 ), Set Shape Column( :picture ) )
)
);
스크립트를 포함시킨 이유는 클릭 한 번으로 결과를 확인할 수 있도록 하기 위함이지만, 이 모든 작업은 스크립트 없이도 그래프 빌더 내에서 수행할 수 있습니다. 핵심 기능은 열 변환(Transform Columns) 과 열 모양 설정(Set Shape Column) 입니다.
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정다음은 마우스 오버 시 레이블을 고정하는 예시입니다. 선택 항목이 0부터 시작하는 인덱싱을 사용하는 것이 흥미롭네요. 행이 선택되지 않은 경우에도 처리하도록 수정해야 할 수도 있습니다.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt << Select Rows( [1 5 7] );
pin_expr = {};
For Each( {v, i}, dt << Get Selected Rows,
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr(
dt << Graph Builder(
Size( 658, 556 ),
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport( Dispatch( {}, "Graph Builder", FrameBox, __pin_expr__ ) )
)
),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);

제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정답변 감사합니다! '도형 열 설정' 기능은 아주 유용하지만, 점들도 함께 표시된다면 더욱 좋을 것 같습니다. 확실히 편리한 방법이네요!
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정
For Each( {v, i}, row_selection,
local_x = Column( dt, col_x )[v];
local_y = Column( dt, col_y )[v];
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Origin( {Expr( local_x ), Expr( local_y )} ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) ),
Offset( {-50, -45} ),
Replace Text( " " ),
Filled( 0 ),
Tag Line( 1 )
)}
)
)
);
);
좋아요! 잘 작동하네요. 그런데 기원 설정을 하지 않았더니 모든 주석이 정확히 같은 위치에 고정되어 버렸습니다. 이 문제를 해결하기 위해 x/y 축 값을 읽어 기원 에 할당했습니다. 숫자 축에서는 완벽하게 작동하지만, 문자열 열 값을 전달하면 앱이 충돌합니다. 문자열 열에 대한 해결 방법이 있을까요? 감사합니다!
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정명목/순서형 열의 경우 축은 0에서 시작하여 각 값마다 1씩 증가합니다. 축 설정에서 이를 확인할 수 있습니다.

데이터 테이블을 기반으로 이를 처리하는 로직을 작성하거나, 점 그래프가 있는 경우 마커에서 값을 가져올 수 있습니다.
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
ms = report(gb)[framebox(1)] << find seg(markerseg(1));
Show(ms << Get X Values, ms << Get Y Values);
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정감사합니다! 모든 X/Y 값을 반환하는 것 같은데, 선택한 행의 X/Y 값만 읽어오려면 어떻게 해야 할까요? 아래 코드를 시도해 봤지만, 반환된 X/Y 값은 제가 선택한 위치의 값이 아닙니다.
r = dt << Get Selected Rows();
ms = Report(gb)[framebox(1)] << Find Seg( Marker Seg( 1 ) );
For Each( {v, i}, r,
t = ms << Get Point( v );
x = t[1];
y = t[2];
show(x,y);
);
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정제 경우에는 이것이 올바른 값을 반환하는 것 같습니다.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
For Each({currow}, selrows,
coord = ms << Get Point(currow);
Show(coord);
);

coord = {0, 59};
coord = {1, 61};
coord = {1, 65};
coord = {1, 63};
coord = {2, 61};
coord = {2, 62};
coord = {3, 67};
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정아, 이제 문제가 뭔지 알겠네요. 행을 숨기거나 제외하면 나머지 데이터에 대해 인덱스 불일치가 발생하는군요.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
pin_expr = {};
For Each({v}, selrows,
coord = ms << Get Point(v);
Show(coord);
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index Row( Expr( v - 1 ) ),
Origin( Expr(coord)),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr( Report(gb)[framebox(1)] << __pin_expr__ ),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);
이 코드를 사용하면 17번째 행이 숨겨지거나 제외될 때 20번째/30번째 행의 주석이 잘못된 위치로 이동하는 문제가 발생합니다.
이런 일이 발생하는 것을 막을 방법이 있을까요? 제외해야 할 데이터 포인트는 분명히 있을 텐데요.
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정잘 되네요, 감사합니다!
ex = dt << Get Excluded Rows;
pin_expr = {};
For Each( {v}, dt << Get Selected Rows,
offset = N Rows(Loc(ex < v));
coord = ms << Get Point(v - offset);
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정이미 제외된 행들을 셀로우에서 삭제하겠습니다.
selrows = dt << Get Rows Where(Selected() & !Excluded())
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정그래프 생성기에 로컬 데이터 필터가 있는 경우 인덱스가 일치하지 않아 문제가 발생합니다.
로컬 필터가 활성화된 그래프를 처리하는 방법이 있을까요?
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정로컬 데이터 필터가 표시할 행 목록은 메시지를 전송하여 얻을 수 있습니다.
<< Get Filtered Rows;
로컬 데이터 필터로
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정도와주셔서 감사합니다! 거의 다 왔어요!
그런데 스크립트로 추가된 주석을 일괄적으로 제거하는 방법이 있을까요?
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정만약 그 모든 항목에 대한 참조를 얻을 수 있다면, 목록에 << 닫기 메시지 << 삭제 메시지 를 추가하여 한 번에 모두 삭제할 수 있을 것 같습니다. 또한 삭제 전에 << 값 초과 >를, 삭제 후에는 << 창 업데이트 >를 활용하는 것도 고려해 볼 만합니다.
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정내 코드는 gb = (Current Report() << Find( "Graph Builder" )) << Get Scriptable Object;를 통해 얻은 기존 그래프 빌더를 위해 설계되었습니다.
그런 다음 mmarchandFSLR의 방식대로 평가 루프를 만들었습니다.
GB 자체에는 접근할 수 있지만, 아래 코드에서 "핀 주석 추가" 목록을 정의할 수 있는 곳은 찾을 수 없는 것 같습니다.
각 항목의 고유 ID 또는 유사한 정보를 읽어와서 << 삭제를 지정하는 방법이 있을까요?
pin_expr = {};
For Each( {v, i}, dt << Get Selected Rows,
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
.....
If( N Items( pin_expr ) > 0,
Eval(
Substitute(
Expr(
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
),
Expr( __pin_expr__ ), Name Expr( pin_expr ),
)
)
);
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt << select rows([1, 10, 21, 30, 40]);
gb = dt << Graph Builder(
Size(658, 556),
Show Control Panel(0),
Variables(X(:age), Y(:height)),
Elements(Points(X, Y, Legend(3)))
);
pins = {};
gb << inval;
frame = Report(gb)[FrameBox(1)];
For Each({currow}, dt << Get Selected Rows,
Eval(EvalExpr(
Insert Into(pins, frame << Add Pin Annotation(
Seg(Marker Seg(1)),
Index(Expr(currow - 1)),
Index Row(Expr(currow - 1)),
UniqueID(Expr(currow - 1))
));
));
);
gb << update window;
wait(1); // demo purposes
pins << Delete;
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정아, 이제 문제가 뭔지 알겠네요. 행을 숨기거나 제외하면 나머지 데이터에 대해 인덱스 불일치가 발생하는군요.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
pin_expr = {};
For Each({v}, selrows,
coord = ms << Get Point(v);
Show(coord);
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index Row( Expr( v - 1 ) ),
Origin( Expr(coord)),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr( Report(gb)[framebox(1)] << __pin_expr__ ),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);
이 코드를 사용하면 17번째 행이 숨겨지거나 제외될 때 20번째/30번째 행의 주석이 잘못된 위치로 이동하는 문제가 발생합니다.
이런 일이 발생하는 것을 막을 방법이 있을까요? 제외해야 할 데이터 포인트는 분명히 있습니다.
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정jthi님, 정말 감사합니다! 진심으로 감사드려요!
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정@jthi 죄송하지만 현재 보고서나 데이터 테이블처럼 사용자가 선택한 현재 프레임을 가져오는 샘플 방식이 있을까요?
저는 이 기능을 사용하지만, 그래프에 스크립트가 추가된 경우에만 사용합니다.
For Each( {f, n}, frames,
Eval( Eval Expr( f << AddGraphicsScript( Handle( ::currentFrame = Expr( f ) ) ) ) )
);
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정XPath를 사용하여 선택된 속성(참 값을 가진 속성)을 찾을 수 있습니다.
Names Default To Here(1);
//This message applies to all display box objects
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Run Script("Bivariate");
Report(biv)[FrameBox(1)] << Select(1);
report(biv) << XPath("//FrameBox[@selected='true']");
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정감사합니다! 사실 마우스 커서가 있는 영역(마우스 오버 또는 클릭) 아래의 프레임을 선택해야 합니다. S + 클릭으로 선택하는 방법도 생각해 봤지만, 더 간단한 방법이 있을까요?
제목: [그래프 작성기] 선택한 행에 마우스 오버 시 레이블 일괄 고정JMP에서는 커서 위치에 쉽게 접근할 수 없기 때문에 (대부분의 경우) 이러한 작업을 수행하기가 훨씬 더 어렵습니다. 설령 접근할 수 있다고 해도 해당 좌표 아래에 어떤 프레임이 있는지 계산해야 합니다. 클릭을 감지하는 것은 가능하지만, 먼저 각 프레임 상자에 그래픽 스크립트를 추가해야 합니다 (그래픽 스크립트는 마우스 클릭/포인트 위로 마우스 커서 이동/드래그 유지 등의 동작에 따라 실행됩니다). 스크립트의 목적에 따라 다른 방법도 있을 수 있습니다. 예를 들어, 사용자에게 프레임 상자 목록을 제공하고 그래픽 스크립트를 추가할 프레임 상자를 선택하게 한 다음, 사용자에게 확인을 누르도록 하는 방법도 있습니다.