大家好
我有一个很大的列表,我循环遍历这些列表,为列表中的每一列创建一个双变量图表。我的 x 轴每次都保持不变。
我也按相同的分类列进行分组。但该列中的组/类别数量每次都会发生变化。
当我不知道有多少个类别时,如何使用双变量图中的“拟合位置”函数来在一张图中查看每列的所有类别?
通常我这样做是为了创造我想要的东西,
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Fishing.jmp" );
bivNew = dt << Bivariate(
Y( :Fish Caught ),
X( :People ),
Automatic Recalc( 1 ),
Fit Where( :Validation == 1, Fit Spline( 1, {Line Color( {212, 73, 88} )} ) ),
Fit Where( :Validation == 2, Fit Spline( 1, {Line Color( {66, 112, 221} )} ) )
);
但在此,我已经对验证列中每个类别的分组(适合位置)进行了硬编码。如果我不知道验证列中有多少个类别,那么在编写自动化解决方案脚本时,如何获得相同的输出。
任何帮助都将不胜感激。
这是一种可行的方法——我个人不使用 JMP 的内置样条线,因为添加的控制框会造成过多的视觉混乱。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Fishing.jmp" );
Try( dt << Delete Columns( "GROUPING" ) );
dt << New Column( "GROUPING", "Character",
<<SET each="" value=""></SET>
有很多方法可以做到这一点,但一个简单的方法是使用一个包含相关功能的小型命名空间:
以下是包含功能/默认设置的库:
New Namespace( "bivar" );
bivar:default settings = [=>];
bivar:default settings["x size"] = 600;
bivar:default settings["y size"] = 400;
bivar:default settings["lambda"] = 1;
bivar:default settings["standardize splines"] = 1;
bivar:default settings["unselected line width"] = 4;
bivar:default settings["line width"] = 4;
bivar:default settings["selected line width"] = 5;
bivar:default settings["marker size"] = 4;
bivar:default settings["outline lines"] = 1;
bivar:default settings["fade unselected lines"] = 1;
bivar:default settings["spline points"] = 128;
<BR /><BR />//this is the only function that a user needs to call
bivar:plot = Function( {table, x column, y column, categorical column, title = "", settings = bivar:default settings},
{Default Local},
columns = table << Get Column Names();
If( Not( Contains( columns, As Name( x column ) ) ),
Throw( "Unable to find column \!"" || x column || "\!"" );
);
If( Not( Contains( columns, As Name( y column ) ) ),
Throw( "Unable to find column \!"" || y column || "\!"" );
);
If( Not( Contains( columns, As Name( categorical column ) ) ),
Throw( "Unable to find column \!"" || categorical column || "\!"" );
);
If( Column( table, x column ) << Get Data Type != "Numeric",
Throw( "X column must be Numeric" );
);
If( Column( table, y column ) << Get Data Type != "Numeric",
Throw( "Y column must be Numeric" );
);
If( Column( table, categorical column ) << Get Data Type != "Character",
Throw( "Legend column must be Character" );
);
table << Color or Mark by Column( categorical column );
olb = Outline Box( "",
Platform( table,
Bivariate(
X( Column( table, x column ) ),
Y( Column( table, y column ) ),
Dispatch(
{}, "Bivar Plot", Frame Box,
{
Frame Size( settings["x size"], settings["y size"] ), Marker Size( settings["marker size"] )
,
Row Legend( Column( table, categorical column ), Marker( 1 ), Continuous Scale( 0 ), Reverse Scale( 0 ), Excluded Rows( 0 ) )
}
)
)
)
);
If( title != "",
olb[Outline Box( 2 )] << Set Title( title )
);
bivar:add splines( table, olb[Frame Box( 1 )], olb[String Col Box( 1 )], x column, y column, categorical column, settings );
olb
);
bivar:add splines = Function( {table, frame box, legend box, x column, y column, categorical column, settings = bivar:default settings},
{Default Local},
sub table = table << Summary( Group( categorical column ), Link to Original Data Table( 0 ), Private );
colors = [=>];
For Each Row( sub table,
colors[Column( 1 )[]] = Color Of( Row State() )
);
legend values = Column( sub table, 1 ) << Get Values;
Close( sub table, No Save );
splines = [=>];
splines["__items__"] = legend values;
splines["__settings__"] = settings;
splines["__colors__"] = colors;
Summation( i = 1, N Items( legend values ),
item = legend values[i];
splines[item] = [=>];
Eval( Parse( Eval Insert( JSL Quote(
rows = table << Get Rows Where( !Excluded( Row State() ) & :Name("^categorical column^") == "^item^" & !Is Missing( :Name("^x column^") ) & !Is Missing( :Name("^y column^") ) )
) ) ) );
ordinate = Column( table, y column )[rows];
abcissa = Column( table, x column )[rows];
If( N Rows( rows ) > 3 & Min( abcissa ) != Max( abcissa ),
If( settings["standardize splines"],
x mean = Mean( abcissa );
x std dev = Std Dev( abcissa );
abcissa = (abcissa - x mean) / x std dev
);
x values = Min( abcissa )::Max( abcissa )::((Max( abcissa ) - Min( abcissa )) / settings["spline points"]);
spline values = Spline Eval( x values, Spline Coef( abcissa, ordinate, settings["lambda"] ) );
If( settings["standardize splines"],
x values = x std dev * x values + x mean
);
,
x values = abcissa;
spline values = ordinate
);
splines[item]["x"] = x values;
splines[item]["y"] = spline values;
;0
);
Eval( Eval Expr(
frame box << Add Graphics Script(
"CUSTOM_SPLINES";
Local( {splines = Expr( splines ), legend = Expr( legend box ), settings = Expr( settings ), selected, i, items, item, selected items},
selected = legend << Get Selected Rows;
If( N Rows( selected ) == 0,
Summation( i = 1, N Items( splines["__items__"] ),
item = splines["__items__"][i];
Transparency( 1 );
If( splines["__settings__"]["outline lines"],
Pen Color( "Black" );
Pen Size( splines["__settings__"]["line width"] + 1 );
Line( splines[item]["x"], splines[item]["y"] )
);
Pen Color( splines["__colors__"][item] );
Pen Size( splines["__settings__"]["line width"] );
Line( splines[item]["x"], splines[item]["y"] );
;0
)
,
selected items = splines["__items__"][selected];
Summation( i = 1, N Items( splines["__items__"] ),
item = splines["__items__"][i];
If( Not( Contains( selected items, item ) ),
If( settings["fade unselected lines"],
Transparency( 1 - Arg( Arg( Get Preferences( Graph Marker Unselected Fade ), 1 ), 1 ) / 100 )
,
Transparency( 1 )
);
Pen Color( splines["__colors__"][item] );
Pen Size( splines["__settings__"]["unselected line width"] );
Line( splines[item]["x"], splines[item]["y"] );
);
;0
);
Summation( i = 1, N Items( splines["__items__"] ),
item = splines["__items__"][i];
If( Contains( selected items, item ),
Transparency( 1 );
If( splines["__settings__"]["outline lines"],
Pen Color( "Black" );
Pen Size( splines["__settings__"]["selected line width"] + 1 );
Line( splines[item]["x"], splines[item]["y"] )
);
Pen Color( splines["__colors__"][item] );
Pen Size( splines["__settings__"]["selected line width"] );
Line( splines[item]["x"], splines[item]["y"] );
);
;0
)
);
items = splines["__items__"]
)
)
) )
);
0在该库至少执行一次之后(例如,将其添加到插件的启动脚本中),您就可以非常轻松地使用它:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = Open( "$SAMPLE_DATA/Reliability/Adhesive Bond.jmp" );
dt3 = Open( "$SAMPLE_DATA/Cars.jmp" );
settings = bivar:default settings;
settings["outline lines"] = 0;
New Window( "test",
V List Box(
bivar:plot( dt3, "year", "wt", "make" )
,
bivar:plot( dt3, "year", "wt", "make", "Custom Title", settings ) // show how to change settings
,
bivar:plot( dt, "Height", "weight", "sex" )
,
bivar:plot( dt2, "weeks", "strength", "censor" )
)
)
现在没有烦人的控制框,我已经使它与标记的选择模式相匹配(假设您有“未选择褪色”标记选择模式)

希望这可以帮助。