JMP图形能有这种效果吗?这是HTML效果。
JMP graphlet 能实现这个效果吗?
谢谢!

自动化和脚本视窗回复:JMP 图形能有这种效果吗?
@hogi wrote:
我如何访问这个命名空间?
两个都:
Report(gb)[FrameBox(1)] << get namespace() ;
(Report(gb)[FrameBox(1)] << find seg(TopSeg (1))) << get namespace();
产生一个新的命名空间。
...我询问了JMP支持:TS- 00173810
很遗憾:
你不能 使用权 这 图形 脚本 命名空间 外部.
回复:JMP 图形能有这种效果吗?噢,当然了—— 你怎样画一个圆圈?
回复:JMP 图形能有这种效果吗?手柄是。圆圈不是。我“认为”非正方形网格上的完美圆形圆圈的半径在 Y 轴坐标中定义。
回复:JMP 图形能有这种效果吗?有趣。为什么手柄不与 x/y 坐标系绑定?
调整图大小后它仍然有效,但存在明显的偏移:
回复:JMP 图形能有这种效果吗?-
回复:JMP 图形能有这种效果吗?您可以使用函数参数而不是 x,y
Names Default To Here( 1 );
New Window( "Example",
trapx = 20;
trapy = 50;
handx = 70;
handy = 80;
trapcolor="blue";
handcolor="blue";
Graph Box(
Frame Size( 200, 200 ),
handle( handx, handy, // any handle(s) must come before Mousetrap
Function( {a, b}, handx=a; handy=b;
Write( Eval Insert( "\!nhand drag ^a^ ^b^" ) );
handcolor="magenta"; )
, // the mouse-up handler
Function( {a, b}, handx=a; handy=b;
Write( Eval Insert( "\!nhand release ^a^ ^b^" ) );
handcolor="cyan"; )
);
Mousetrap( // should not be more than one Mousetrap, the first one captures all clicks
Function( {a, b}, trapx=a; trapy=b;
Write( Eval Insert( "\!ntrap drag ^a^ ^b^" ) );
trapcolor="red"; )
, // the mouse-up handler
Function( {a, b}, trapx=a; trapy=b;
Write( Eval Insert( "\!ntrap release ^a^ ^b^" ) );
trapcolor="green"; )
);
// the drawing occurs outside of the mousetrap or handle
pencolor(trapcolor);
pensize(3);
Circle( {0, 0}, Sqrt( trapx * trapx + trapy * trapy ) );
pencolor(handcolor);
pensize(3);
Circle( {0, 0}, Sqrt( handx * handx + handy * handy ) );
)
);
如果您需要一个或多个句柄,则它们必须出现在捕鼠器之前,因为如果没有先前的句柄占用它,捕鼠器将会消耗一次点击。
回复:JMP图形可以产生这种效果吗?
好的,每个 Framebox 一个共享命名空间——与全局命名空间分开。
- 并且与其他 FrameBox 的命名空间分开。
编辑:哇,对研究结果的解读完全错误。
::x= 5;
(Report( gb )<< xpath("//FrameBox")) << add graphics script(//
If(Not( Is Empty( x ) ), // if the mouse did not yet enter the graph -> do nothing.
Caption("global x is "|| Char(::X));
V Line(x+3);
)
//
);
视频结尾处还有另一项发现:
重新缩放窗口会触发图表重置,使用这里命名空间中的原始值。
如何访问这个命名空间?
两个都:
Report(gb)[FrameBox(1)] << get namespace() ;
(Report(gb)[FrameBox(1)] << find seg(TopSeg (1))) << get namespace();
创建一个新的命名空间。
回复:JMP 图形能有这种效果吗?我刚刚在脚本索引中找到了这些信息:

坐标 x 和 y 存储为脚本执行的全局变量。
并且任何预先存在的全局变量 x 和 y 都会在执行脚本后恢复。
故事可能到此结束了。
取消注释
// x=y=60;
让图表从 x = 60 处的一条线开始。-> 该脚本使用来自Here命名空间的局部变量。
令我惊讶的是:
当我尝试将线拖到另一个位置时,它起作用了!
为什么这令人惊讶:
Here命名空间内的 x 保持在 60。并且脚本将优先使用Here命名空间中的变量,而不是全局命名空间中的变量。[编辑:对于全局变量,此时应“恢复”原始值:执行 MouseTrap 后]。那么,脚本为什么能工作呢?!
似乎脚本内部优先使用局部变量 x 和 y,而不是Here命名空间中的变量。这个解释正确吗?
然后,在行下,JMP 对全局变量做了额外的工作,这很好。这样,即使是图形脚本上下文之外的函数(myfunctions:xy)也可以访问变量:)
也许有趣的是检查:
一个 FrameBox 的图形脚本 - 它们是否共享一个公共的命名空间,或者每个图形脚本是否使用它自己的...
回复:JMP 图形能有这种效果吗?我懂了
谢谢克雷格!
回复:JMP 图形能有这种效果吗?@hogi MouseTrap 在 JSL 中是一个奇怪的东西。它是一个在执行时不执行任何操作的函数,无论它是否执行或(大多数情况下)它在脚本中的位置都无关紧要。当鼠标在图形上移动时,坐标将以 x,y 的形式发送到脚本,需要将其复制到全局变量中,如图所示。
Handle 和各种 Drag 变体都具有与其关联的位置,并且只有在足够接近时才会激活。顺序确实有一点重要,因为脚本中遇到的第一个足够接近(几个像素)的变体将获得更新。
我无法完全解释为什么它能适应您的更改。X 真的不应该存在……它似乎逃脱了陷阱!
我在第一篇文章中修复了该脚本。
回复:JMP 图形能有这种效果吗?看起来像是添加一个悬停钻孔脚本。
For(iFrame=1,iFrame<=N Items(framelist),iFrame+=1,frame=framelist[iFrame]; Eval(Eval Expr(frame<<ADDGRAPHICSSCRIPT></ADDGRAPHICSSCRIPT>
Thanks Experts!
回复:JMP 图形能有这种效果吗?@Craige_Hales ,很好,非常顺利! 
几乎太顺利了:我希望这个例子不会阻止开发人员实现非 JSL 方法。
通过 Graph Builder 进行本机支持的一些参数:
- 使原生 Graph Builder 更加强大
- 让非 JSL 用户也感到高兴
- 即使没有鼠标点击也可以显示自动注释
-> 允许用户像平常一样使用鼠标选择数据点
(使用当前的“JSL”方法,可以添加一些切换按钮来选择正确的模式 - 就像它为维恩图实现的那样)
我花了一段时间才明白错误信息!
Names default to here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
);
// x=y=60;
fb = Report( gb )[FrameBox( 1 )];
fb << addgraphicsscript(//
If(Not( Is Empty( x ) ), // if the mouse did not yet enter the graph -> do nothing.
Mousetrap("nothing to do");
V Line(x);
// at this point you can highlight all the values near xx
For( irow = 1, irow <= N Rows( dt ), irow += 1,
If( Abs( dt:height[irow] - x ) < 0.5, // big class height step is 1, <.5 selects a single column of weights
Marker( Marker State( 4 ), {dt:height[irow], dt:weight[irow]} )
)
);
xwidth = X Range();
xmidpoint = X Origin() + xwidth / 2;
If( x < xmidpoint,
Text( {x + xwidth / 100, y}, "height " || Char( Round( x ) ) || "\!nmore" )//
,
Text(
right justified,
{x - xwidth / 100, y},
"height " || Char( Round( x ) ) || "\!nmore"
)
);
)
//
);
回复:JMP 图形能有这种效果吗?
回复:JMP 图形能有这种效果吗?
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
);
fb = Report( gb )[FrameBox( 1 )];
xx = yy = 0;
fb << addgraphicsscript(//
Mousetrap(
xx = x;
yy = y;
);
V Line( xx );
// at this point you can highlight all the values near xx
For( irow = 1, irow <= N Rows( dt ), irow += 1,
If( Abs( dt:height[irow] - xx ) < 0.5, // big class height step is 1, <.5 selects a single column of weights
Marker( Marker State( 4 ), {dt:height[irow], dt:weight[irow]} )
)
);
xwidth = X Range();
xmidpoint = X Origin() + xwidth / 2;
If( xx < xmidpoint,
Text( {xx + xwidth / 100, yy}, "height " || Char( Round( xx ) ) || "\!nmore" )//
,
Text( right justified, {xx - xwidth / 100, yy}, "height " || Char( Round( xx ) ) || "\!nmore" )
);
//
);
编辑:第 18 行现在显示 xx 而不是 x。一定是我的命名空间中遗留了一些东西。谢谢@lala @hogi
回复:JMP 图形能有这种效果吗?通过(无 JSL )图形生成器:目前还没有。也许在将来的版本中?
越来越多的竞争程序提供这种类型的注释,所以我猜测它也将在 JMP 中实现。
您可以转到新型十字线以获得线条和平滑类型图表并支持@shampton82的愿望。
回复:JMP 图形能有这种效果吗?通过 JSL,是的。
回复:JMP 图形能有这种效果吗?稍微改变脚本来显示重量值而不是更多:
names default to here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
gb = dt << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ), Overlay( :sex ) ),
Elements( Points( X, Y, Legend( 1 ) ), Smoother( X, Y, Legend( 2 ) ) )
);
fb = Report( gb )[FrameBox( 1 )];
xx = yy = 0;
valuesMatrix = :height << Get Values; //***new*** Get column values for height
fb << addgraphicsscript(//
Mousetrap(
xx = x;
yy = y;
);
V Line( xx );
// at this point you can highlight all the values near xx
For( irow = 1, irow <= N Rows( dt ), irow += 1,
If( Abs( dt:height[irow] - xx ) < 0.5, // big class height step is 1, <.5 selects a single column of weights
Marker( Marker State( 4 ), {dt:height[irow], dt:weight[irow]} )
)
);
valuesRows = char(:weight[loc(valuesMatrix,round(xx))]); //***new*** write to char weight values for all rows of height at position round(xx)
xwidth = X Range();
xmidpoint = X Origin() + xwidth / 2;
If( xx < xmidpoint,
Text( {xx + xwidth / 100, yy}, "height " || Char( Round( xx ) ) || "\!nweight " || valuesRows )////***new*** exchanged "more" with weigth and list of weight values for that location of height
,
Text( right justified, {xx - xwidth / 100, yy}, "height " || Char( Round( xx ) ) || "\!nweight " || valuesRows )
);
//
);
您甚至可以添加按升序/降序对值进行排序。
回复:JMP图形可以产生这种效果吗?嗯,我觉得我的很多结论都是错的。
再试一次:

- 或许
并非指“运行[拖动]脚本之后”,而是指“鼠标抬起时”。
- 这一点非常重要。如果不需要更新框架盒 ,就不会进行更新。
所以,
- 当鼠标移动时,新的坐标会保存到 x 和 y 坐标轴中。
(
?不——在 Here 命名空间中,因为我们使用了名称默认值为 HERE (1) )
- ……而且这些值可以在 Here 命名空间内使用——甚至在捕鼠器()函数之外也可以使用。这让@Craige_Hales感到困惑,而我则进一步陷入了这个陷阱: 制作拖放脚本
- 变量更新后,JMP 会触发图形脚本和当前的 x 和 y 值重新绘制框架盒。
- 其他框架框不会更新:
如果我们将鼠标移动到左侧框架框中,中间的框架框不会更新——反之亦然。
这就造成了两个独立命名空间的假象。因此,用户无法访问框架框的命名空间也就不足为奇了——因为根本没有这样的命名空间。它只是共享的这里命名空间与本地框架框更新的组合。
- 松开鼠标按钮后,x 和 y
。
然而,框架框并未触发任何更新。因此,用户不会注意到此处命名空间中变量的重置。
- 当图表下次更新时(例如调整大小或选择一些数据点),图形脚本再次执行,结果显示这些值(在一段时间前)已被重置。
回复:JMP图形可以产生这种效果吗?gpt-5.6-luna。
让我想起了这篇文章

不错!
回复:JMP图形可以产生这种效果吗?这真是太酷了, @Craige_Hales 、 @martindemel和@hogi 。
这是一个非常棒的功能,我完全支持在图表构建器中原生支持类似的功能。我喜欢它能高亮显示点击图表位置附近的数据点。
有没有办法把它“关闭”呢?点击图表后,那条垂直线就会一直显示在那里。如果能在操作完成后重置图表就好了。而且,这个功能或许用平台原生实现比用 JSL 实现更容易。
谢谢!,
DS
回复:JMP图形可以产生这种效果吗?@SDF1谢谢!你可以给 Mousetrap 添加第二个脚本参数来检测按钮释放并移除图形脚本。第一个脚本会在鼠标按下和每次后续鼠标移动时调用。如果提供了第二个脚本,它会使用相同的参数来指示鼠标抬起。
回复:JMP图形可以产生这种效果吗?我从未想过Gemini 3.1 Pro能够完成这部杰作。 
回复:JMP图形可以产生这种效果吗?克劳德·费布尔 5 