是什么促使你提出这个愿望清单请求?
(编辑)显然,模板在这里添加了一堆文本。其设计理念是,无论指定的绘制顺序如何,选中的行都会绘制在每个用户自定义图形脚本的上方。
我知道开发人员原本想修复未选中数据点显示在已选中数据点上方的问题,但他们采取了偷懒的办法,彻底扼杀了用户自定义绘制顺序的希望。现在,选中的数据点会显示在所有其他数据点之上。我甚至都觉得鼠标指针会显示在已选中数据点上方有点不可思议。
您希望看到哪些改进?
(编辑:由于此表单丢失了我之前的回复)我希望 JMP 能够遵循图形自定义列表中指定的绘制顺序。如果用户在标记段之后附加图形脚本,那么该脚本绘制的任何元素都应该绘制在所有标记之上,就这么简单。
为什么这个想法很重要?
(编辑:由于此表单丢失了我的第一条回复)这显然非常重要。极其重要。以至于我的组织正在投入大量资源开发替代方案,例如 Python 或在线 JavaScript。现在有很多工作流程在 JMP14 或 16 中根本无法完成。
请看下图:

在这里,我可能想通过在图例中选择特定项目来突出显示它。但是,当我这样做时,密集的数据点会完全遮蔽所有样条曲线,即使样条曲线是在标记线段之后作为单独的脚本绘制的。

这只是一个例子。在我的组织中,通常会有成千上万甚至数十万个数据点。为了正确地使用这些数据,需要在数据点上方绘制某种自定义的汇总图形(无论是样条曲线、目标线、置信区间还是其他任何类似的自定义图形)。但在 JMP14 及更高版本中,这种做法完全失去了交互性,因为选择项目(及其关联的数据点)会完全遮挡图表上绘制的所有其他图形。
虽然我们单位升级到新版 JMP 的速度很慢(很多人还在用 JMP12),但我不得不告诉大家,新版 JMP 的工作流程和以前完全不一样了。我们非但没有获得更快的速度和更好的功能,反而得到了一个完全没用的东西。
虽然我理解用户可以简单地取消选择行(例如,通过单击单个数据点),但这种针对 JMP 开发人员从根本上糟糕的设计决策而采取的变通方法不应该是必要的,而且并非总是可以接受的(并且还会改变视觉效果/意义):

在我看来,这个问题非常严重,JMP 应该提供一个热修复程序,为 JMP14 及更高版本的所有用户系统打补丁,而不是等到 JMP18 再进行修复。
好吧,现在我明白你的意思了。 我明白,这可能很烦人......
尽管如此,你的解决方法()很棒 - 当我懒得优化图表本身时我也会使用它。
底下人们可以说:好多了
比
*) 在 Jmp 16 中导出的交互式 html 文件中,曲线未置于前面。 幸运的是,JMP 17 修复了这个错误:)
仪表板中的曲线:发送到前面?
为了让Jmp变得更好......
最初的愿望:
与“突出显示”(将项目发送到前面)的一般思想相冲突,对吧?
实际的问题只是:
如何在自定义窗口中添加一个复选框以强制项目保持“在所有内容之上”
相同的功能可以更广泛地使用,例如,也可以在突出显示的数据点之上保持更平滑的拟合。

关于即使未选择任何内容也会隐藏数据点的“突出显示”数据点?
使点变小或稍微透明也有帮助。
选择一个子集后用 200k 数据点绘图:

dt = Open( "$SAMPLE_DATA/Airline Delays.jmp" );
dt = dt << Concatenate(
dt, dt, dt,
Append to first table
);
dt << Concatenate( dt, Append to first table);
dt << Select where( :Airline == "Northwest" );
Graph Builder(
Size( 618, 479 ),
Show Control Panel( 0 ),
Summary Statistic( "Median" ),
Graph Spacing( 4 ),
Variables( X( :Day of Week ), Y( :Elapsed Time ), Overlay( :Airline ) ),
Elements( Points( X, Y, Legend( 9 ) ), Smoother( X, Y, Legend( 10 ) ) ),
SendToReport(
Dispatch(
{},
"Elapsed Time",
ScaleBox,
{Min( -1.344 ), Max( 370.36832 ), Inc( 100 ), Minor Ticks( 1 )}
),
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
9,
Base( 0, 0, 0, Item ID( "American", 1 ) ),
Base( 1, 0, 1, Item ID( "Delta", 1 ) ),
Base( 2, 0, 2, Item ID( "Northwest", 1 ) ),
Base( 3, 0, 3, Item ID( "United", 1 ) ),
Base( 4, 0, 4, Item ID( "US Airways", 1 ) ),
Base( 5, 0, 5, Item ID( "Southwest", 1 ) ),
Properties(
0,
{Marker Size( 2 ), Transparency( 0.2 )},
Item ID( "American", 1 )
),
Properties(
1,
{Marker Size( 2 ), Transparency( 0.2 )},
Item ID( "Delta", 1 )
),
Properties(
2,
{Marker Size( 2 ), Transparency( 0.2 )},
Item ID( "Northwest", 1 )
),
Properties(
3,
{Marker Size( 2 ), Transparency( 0.2 )},
Item ID( "United", 1 )
),
Properties(
4,
{Marker Size( 2 ), Transparency( 0.2 )},
Item ID( "US Airways", 1 )
),
Properties(
5,
{Marker Size( 2 ), Transparency( 0.2 )},
Item ID( "Southwest", 1 )
)
), Legend Model(
10,
Properties( 0, {Line Width( 5 )}, Item ID( "American", 1 ) ),
Properties( 1, {Line Width( 5 )}, Item ID( "Delta", 1 ) ),
Properties( 2, {Line Width( 5 )}, Item ID( "Northwest", 1 ) ),
Properties( 3, {Line Width( 5 )}, Item ID( "United", 1 ) ),
Properties( 4, {Line Width( 5 )}, Item ID( "US Airways", 1 ) ),
Properties( 5, {Line Width( 5 )}, Item ID( "Southwest", 1 ) )
)}
),
Dispatch(
{},
"Graph Builder",
FrameBox,
{Add Graphics Script(
15,
Description( "" ),
Pen Color( "black" );
Pen Size( 4 );
Y Function( 120 + Sin( x * 2 ) * 20, x );
)}
)
)
)
也许我不清楚——添加的线画在所选数据点的下方。颜色是什么、数据点的大小是什么或者透明度是多少并不重要。
点(或标记段)都在幕后。
自定义列表:

不同颜色的线:

选定的点遮盖了线:

请记住,这只是一个小例子。许多绘图可能总共有 400,000 个数据点,在这种情况下,不可能看到所选点之上的任何内容。
问题是所有选定的数据点都会忽略绘制顺序,并绘制在任何自定义脚本生成的形状之上。 时期。 没有解决办法。
问题和您描述的差不多,但稍微复杂一些。实际上,所有 segs 都有两个绘制过程。第一个过程允许 segs 绘制任何未选中的内容,第二个过程允许 segs 绘制任何选中的内容。一些 segs(如标记 segs)在两个过程中绘制。其他 segs(如图形脚本)没有选中状态,因此它们只是在第一个未选中过程中绘制。最简单的解决方案是按照@hogi的建议添加一个选项,允许在任一过程中进行绘制,或者允许脚本与行状态处理程序相关联,以便它可以具有更动态地以正确的 z 顺序绘制的能力。我可以想象一个包含大量图形脚本的图形,因此有些总是被遮挡,而基于行选择的绘制顺序也可以帮助解决这种情况。
我知道您的示例只是一个简单的示例,只是为了展示问题,但我想知道您的具体问题是否真的与绘制线条的图形脚本有关。如果是,您可以改用 LineSeg 吗?对脚本的这种修改更接近您的目标
Names Default To Here( 1 );
table = New Table( "test table",
Add Rows( 15000 ),
<<NEW column=""></NEW>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="DaveB_0-1728324750394.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="DaveB_0-1728324750394.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="DaveB_0-1728324750394.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="DaveB_0-1728324750394.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="DaveB_0-1728324750394.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="DaveB_0-1728324750394.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/68875i75127179C9D41C69/DaveB_0-1728324750394.png" role="button" title="DaveB_0-1728324750394.png" alt="DaveB_0-1728324750394.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P>
<P>不幸的是,该示例在画笔选择方面仍然存在问题。线段是可选的,但我们优先考虑标记,因此如果选择了标记,则画笔选择(不使用 Shift 键)会取消选择该线。您可以单击该线以重新选择它,但如果有足够多的标记,则可能没有任何地方可以单击。一个公认的尴尬的解决方法是获取线段的克隆版本,该版本在刷牙期间不会取消选择</P>
<CODE class=" language-jsl">Names Default To Here( 1 );
table = New Table( "test table",
Add Rows( 15000 ),
<<NEW column=""></NEW>
<P>另一个选项是使用数据表来表示行状态。这样做的缺点是,lineseg 只会检查行 1 到 n,其中 是行中的点数,因此,要在选择任何行时选择该行,需要添加许多不必要的点。</P>
<CODE class=" language-jsl">Names Default To Here( 1 );
table = New Table( "test table",
Add Rows( 15000 ),
<<NEW column=""></NEW>
<P> </P>
<P> </P>