JMP 17.2 版
我有一个图,我想同时使用叠加(分隔线条)和颜色(以相同的方式为相关线条着色)。这很有效,但在提取框架框时,我丢失了所有颜色。我可以通过抓取图片框来保留颜色,但我不知道如何计算 x 轴开始之前图中的左偏移量。似乎我应该使用 y 轴宽度加上 y 轴标签(文本编辑框),但是文本编辑框返回的宽度为 -1。
是否有一个好方法来计算左边距,或者(更好的)一种方法来保留框架内的所有颜色?
// illustrate technique and problem
dt = New Table( "frame_box_ex",
Add Rows( 48 ),
New Column( "X",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected,
Set Values(
[1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8]
)
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[1.45808886692691, 2.39035819973415, 2.99796363989942, 4.0175538469545,
4.97635791617404, 5.26099494066037, 6.35297458603344, 7.08128130389934,
1.28206570793684, 2.65813273844257, 3.90780332034481, 5.56931861718803,
6.5102957541246, 7.85452087528389, 8.38346720371831, 9.83684443692199,
1.07112111561808, 1.80813159968191, 3.60012537918958, 4.59349059340839,
6.0331086735015, 7.38976749487193, 8.09249962943829, 8.6144549883821,
0.793139090953735, 1.29469742405061, 1.76519280701643, 2.08182485552223,
2.78446654871733, 3.65492098470701, 4.60137160145799, 5.4641050584207,
-0.0498633817348688, 0.867775467257285, 2.19640092615135,
3.8415359972872, 5.73235903219136, 6.60516876928658, 7.45020127543143,
8.66546760100397, 0.781073560404989, 1.96654139416073, 2.08763174310172,
2.25180062442375, 3.88484451908061, 4.67635031701802, 5.77656366166124,
6.97420411204293]
)
),
New Column( "Unit",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6]
)
),
New Column( "Group",
Numeric,
"Nominal",
Format( "Best", 12 ),
Set Values(
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
)
)
);
gb = dt << Graph Builder(
Size( 600, 600 ),
Variables( X( :X ), Y( :Y ), Overlay( :Unit ), Color( :Group ) ),
Elements( Line( X, Y, Legend( 14 ) ) ),
SendToReport(
Dispatch(
{},
"X",
ScaleBox,
{Min( 0 ), Max( 8 ), Inc( 1 ), Minor Ticks( 0 )}
)
)
);
nw = New Window( "for testing",
Outline Box( "complicated plot",
Spacer Box( Size( 2, 10 ) ),
lu1 = Lineup Box( N Col( 3 ), Spacing( 0 ) )
)
);
lu1 << Append( Report( gb )[AxisBox( 2 )] );
lu1 << Append( Report( gb )[FrameBox( 1 )] );
lu1 << Append( Report( gb )[LegendBox( 1 )] );
//end of row
lu1 << Append( Spacer Box() );
lu1 << Append( Report( gb )[AxisBox( 1 )] );
lu1 << Append( Spacer Box() );
//end of row
lu1 << Append( Spacer Box() );
lu1 << Append( insrt_icons = H List Box() );
lu1 << Append( Spacer Box() );
numXAxisWidth = (gb << report)[AxisBox( 1 )] << get width;
numSteps = N Items( Associative Array( Column( dt, "X" ) ) << get keys );
numOneIncr = (numXAxisWidth) / (numSteps);
For( _i = 1, _i <= numSteps, _i++,
insrt_icons << Append( Spacer Box( Size( numOneIncr, numOneIncr ), Color( _i ) ) )
);
有趣的方法!如果你能把所有东西都放在框架框内,那就更容易了……只需使用图形的坐标系即可。我怀疑你会与显示框的整数坐标系作斗争,并试图找到正确的原点;你还会将图形与轴断开连接(拖动刻度等不起作用)。
dt = New Table( "frame_box_ex",
Add Rows( 48 ),
New Column( "X",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected,
Set Values(
[1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6,
7, 8]
)
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[1.45808886692691, 2.39035819973415, 2.99796363989942, 4.0175538469545, 4.97635791617404, 5.26099494066037, 6.35297458603344,
7.08128130389934, 1.28206570793684, 2.65813273844257, 3.90780332034481, 5.56931861718803, 6.5102957541246, 7.85452087528389,
8.38346720371831, 9.83684443692199, 1.07112111561808, 1.80813159968191, 3.60012537918958, 4.59349059340839, 6.0331086735015,
7.38976749487193, 8.09249962943829, 8.6144549883821, 0.793139090953735, 1.29469742405061, 1.76519280701643, 2.08182485552223,
2.78446654871733, 3.65492098470701, 4.60137160145799, 5.4641050584207, -0.0498633817348688, 0.867775467257285, 2.19640092615135,
3.8415359972872, 5.73235903219136, 6.60516876928658, 7.45020127543143, 8.66546760100397, 0.781073560404989, 1.96654139416073,
2.08763174310172, 2.25180062442375, 3.88484451908061, 4.67635031701802, 5.77656366166124, 6.97420411204293]
)
),
New Column( "Unit",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
6, 6]
)
),
New Column( "Group",
Numeric,
"Nominal",
Format( "Best", 12 ),
Set Values(
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2]
)
)
);
gb = dt << Graph Builder(
Size( 600, 600 ),
Show Control Panel( 0 ),
Variables( X( :X ), Y( :Y ), Overlay( :Unit ), Color( :Group ) ),
Elements( Line( X, Y, Legend( 14 ) ) ),
SendToReport(
Dispatch( {}, "X", ScaleBox, {Min( 0 ), Max( 9 ), Inc( 1 ), Minor Ticks( 0 )} ),
Dispatch( {}, "Y", ScaleBox, {Min( -1 ), Max( 10.1 ), Inc( 2 ), Minor Ticks( 0 )} )
)
);
Report( gb )[framebox( 1 )] << addgraphicsscript(
Text( {1, 8}, JMP Version() );
For( here:x = 1, here:x < 8, here:x += 1,
Fill Color( HLS Color( here:x / 9, .5, 1 ) );
Rect( here:x, -.2, here:x + 1, -.8, 1 );
Fill Color( "white" );
Circle( {x + .5, -.5}, .25, "FILL" );
Text Color( "black" );
Text Size( 12 );
Text( center justified, {x + .5, -.65 /*vertical centering depends on text size*/}, Substr( "ABCDEFG", x, 1 ) );
);
);
Add a graphics script to the framebox to make custom displays.向框架框添加图形脚本以进行自定义显示。