如何在具有分组 x 轴且重复值为不同 N 的可变性图表中添加具有共享 y 轴的动态水平线?大家好,
我想根据我之前的帖子创建一个新的线程来区分: https://community.jmp.com/t5/Discussions/How-to-add-Dynamic-horizo ntal-line-by-shared-y-axis-among/mp/622722。同样的想法也适用于我想要在变异性图表上画一条动态水平线的地方,但与之前使用关联数组的解决方案不同,因为每个 x 有一个值,而这种情况可能每个 x 有多个值分组,其中基于每个 x 的 N 的图形不起作用,因为 N 在条件之间分割并且必须这样绘制。这就是我正在努力弄清楚如何做到这一点的地方,如果可能的话,我希望有更多图形脚本编写经验的人来帮忙。下面是所需的输出,例如手绘线条,生成图形的代码也在下面。
在下面的例子中,丰田现在被分成 :Protection,其中 N=8 和 N=3,同样,福特的分组为 N=11 和 N=3,我想确保丰田组和福特组以及其他组都有一条水平线,其值为 Max(:Wt),如红线和蓝线所示,所有其他组都有一条同样独特的线,如紫线所示。任何关于如何实现这一点的想法都将非常棒。在帖子的底部, @ErraticAttack提供的代码被发布为分组和绘图的绝佳模板,但由于它是一个关联数组,它会说丰田是 N:8+3 = 11,同样福特是 11+3=14 宽,并且绘制的范围是错误的,因为它们现在被分开了。 
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
rpt = dt << Variability Chart(
Y( :Head IC),
X( :Protection, :Make, :Model ),
Analysis Type( "Choose best analysis (EMS REML Bayesian)" ),
Show Range Bars( 0 ),
Show Cell Means( 0 ),
Std Dev Chart( 0 ),
Points Jittered( 1 ),
By( :NAME("D/P")),
);@ErraticAttack的代码可以帮助我解答之前的问题。
names default to here(1);
dt =
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Cars.jmp" );
rpt = dt << Variability Chart(
Y( :Head IC),
X( :Make, :Model ),
Analysis Type( "Choose best analysis (EMS REML Bayesian)" ),
Show Range Bars( 0 ),
Show Cell Means( 0 ),
Std Dev Chart( 0 ),
Points Jittered( 1 ),
Where( :NAME("D/P") == "Driver" & :Protection == "manual belts" ),
);
//find groupings:
rows = dt << Get Rows Where( :NAME("D/P") == "Driver" & :Protection == "manual belts" );
subt = dt << Subset( Rows( rows ), Columns( :Make, :Model, :Wt ), Not Linked, Private );
sumt = subt << Summary( Group( :Make, Model ), Mean( :Wt ), Statistics Column Name Format( "Column" ), Link to Original Data Table( 0 ), Private );
Close( subt, No Save );
subt = sumt << Summary( Group( :Make ), Mean( :Wt ), Statistics Column Name Format( "Column" ), Link to Original Data Table( 0 ), Private );
Close( sumt, No Save );
category number = [=>];
category average = [=>];
For Each Row( subt,
category number[:Make] = :N Rows; // each least-significant category in a VariabilityPlot is exactly X=1 width on the hidden x-axis, starting at zero
category average[:Make] = :Wt
);
Close( subt, No Save );
tree = rpt << Report;
Eval( Eval Expr(
tree[FrameBox( 1 )] << Add Graphics Script(
Local( {values = Expr( category average ), numbers = Expr( category number ), i, items, sum = 0},
items = numbers << Get Keys;
Pen Size( 2 );
Pen Color( "Blue" );
Summation( i = 1, N Items( items ),
Line( Eval List( {sum, values[items[i]]} ), Eval List( {sum += numbers[items[i]], values[items[i]]} ) );
0
)
)
)
) )谢谢,真心感谢任何帮助!
自动化和脚本基础数据分析与建模数据探索与可视化大规模定制视窗回复:如何在具有分组 x 轴且重复值为不同 N 的可变性图表中添加具有共享 y 轴的动态水平线?谢谢你吉姆!
回复:如何在具有分组 x 轴且重复值为不同 N 的可变性图表中添加具有共享 y 轴的动态水平线?在第 37 行,你需要从
fb = Report(varchart)[i][FrameBox(1)];
到
fb = Report( varchart[i] )[FrameBox( 1 )];
回复:如何在具有分组 x 轴且重复值为不同 N 的可变性图表中添加具有共享 y 轴的动态水平线?嗨@jthi ,
感谢您的解决方案,这是一个相当优雅的答案。正如您所提到的,它仅适用于一个 Framebox,我理想情况下希望它适用于可变性图表生成的两个 Framebox。我已经调整了您的代码以适应这一点,但无法让水平线同时显示两个。如果您能看到错误并知道如何解决,那就太好了。谢谢!
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cars.jmp");
varchart = dt << Variability Chart(
Y(:Head IC),
X(:Protection, :Make, :Model),
Analysis Type("Choose best analysis (EMS REML Bayesian)"),
Show Range Bars(0),
Show Cell Means(0),
Std Dev Chart(0),
Points Jittered(1),
By(:"D/P"n)
);
dt << new column("Group", Character, Nominal, Formula(
:"D/P"n || :Protection || :Make // don't add model here
));
dt_summary = dt << Summary(
Group(:Group),
Max(:Wt),
N Categories(:Model),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0),
//Invisible
);
uniq = Associative Array( Column( dt, "D/P" ) << GetValues ) << GetKeys;
for(i = 1, i <= N Items(uniq), i++,
dt_summary_subset = dt_summary << Subset( Rows( dt_summary << get rows where(Substr(:Group, 1, Length(uniq[i])) == uniq[i])),
Columns(), Not Linked);
weights = dt_summary_subset[0, "Wt"];
counts = dt_summary_subset[0, "Model"];
fb = Report(varchart)[i][FrameBox(1)];
Eval(Eval Expr(
fb << Add Graphics Script(
Local({refs = Expr(weights), counts = Expr(counts), i, sum = 0},
Pen Size(2);
Pen Color("Blue");
Summation(i = 1, N Items(counts),
Line(Eval List({sum, refs[i]}), Eval List({sum += counts[i], refs[i]}));
);
)
)
));
);回复:如何在具有分组 x 轴且重复值为不同 N 的可变性图表中添加具有共享 y 轴的动态水平线?一个相当简单的选择是为您的团队创建新的列。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cars.jmp");
// for simplicity sake we drop Passenger
rows_to_delete = dt << Get Rows Where(:"D/P"n == "Passenger");
dt << Delete Rows(rows_to_delete);
varchart = dt << Variability Chart(
Y(:Head IC),
X(:Protection, :Make, :Model),
Analysis Type("Choose best analysis (EMS REML Bayesian)"),
Show Range Bars(0),
Show Cell Means(0),
Std Dev Chart(0),
Points Jittered(1),
By(:"D/P"n)
);
dt << new column("Group", Character, Nominal, Formula(
:"D/P"n || :Protection || :Make // don't add model here
));
dt_summary = dt << Summary(
Group(:Group),
Max(:Wt),
N Categories(:Model),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0),
Invisible
);
weights = dt_summary[0, "Wt"];
counts = dt_summary[0, "Model"];
Close(dt_summary, no save);
fb = Report(varchart)[FrameBox(1)];
Eval(Eval Expr(
fb << Add Graphics Script(
Local({refs = Expr(weights), counts = Expr(counts), i, sum = 0},
Pen Size(2);
Pen Color("Blue");
Summation(i = 1, N Items(counts),
Line(Eval List({sum, refs[i]}), Eval List({sum += counts[i], refs[i]}));
);
)
)
));
请注意,此示例只有一个框架框,因为其他 D/P 被删除