Estoy intentando crear este gráfico bivariado para cada oblea que tengo en una cadena. Se ve bien, excepto que me gustaría actualizar la leyenda de la fila con colores y marcadores personalizados, ya que hay muchas opciones de colores diferentes en FailCode para distinguirlas. No puedo utilizar los temas de color generales. ¿Hay alguna manera de ¿Crear especificaciones de leyenda personalizadas que serán las mismas para cada gráfico creado en JSL?
*Estaba tratando de pensar en una forma de actualizar el script después de realizar estos cambios y copiarlo en mi script. Sin embargo, no he tenido suerte.
Bivariate(
Y( :YLoc ),
X( :XLoc ),
By(:Wafer),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Marker Size( 6 ), Row Legend(
FailCode,
Color( 1 ),
Color Theme( "Strong and Pastel Mix" ),
Marker( 0 ),
Marker Theme( "" ),
Continuous Scale( 0 ),
Reverse Scale( 0 ),
Excluded Rows( 0 )
)}
)
)
);
Puede crear una leyenda personalizada a partir de cuadros de gráfico dentro de un cuadro de columna dentro de un cuadro de tabla.
Por ejemplo, aquí creo una tabla que contiene los códigos de error y los estados de fila que se usarán para cada uno (probablemente querrás configurar esto en un espacio de nombres global para reutilizarlo en tu código y hacer que la tabla sea privada para que no No se muestra).
A continuación creo dos tablas de datos de ejemplo, una de las cuales tiene solo la mitad de los códigos de error definidos.
A continuación, creo dos funciones: una realiza una clasificación inteligente para que las entradas de leyenda consecutivas sean consecutivas (es decir, para que "FailCode_1, FailCode_10, FailCode_2" se ordene correctamente).La segunda función traza las bivariadas y agrega una leyenda personalizada.
Cuando ejecute esto, observe cómo los colores y marcadores de cada gráfico son los mismos para el mismo código de error.Probablemente quieras configurar los colores y marcadores para tu código, esto es simplemente un ejemplo.
Names Default to Here( 1 );
colors = {
//{r,g,b}
{1,0.5,0},
{1,0,1},
{0,1,1},
{1,0,0},
{0,1,0},
{0,0,1},
{0.7, 0.5, 0.3},
{0.3, 0.5, 0.7},
{0.5, 0.3, 0.7},
{0.5, 0.7, 0.3},
{0.7, 0.5, 0.7},
{0.5, 0.7, 0.5},
{0.3, 0.7, 0.7},
{0.9, 0.1, 0.2},
{0.3, 0.5, 0.6},
{0.1, 0.3, 0.9},
{0.5, 0.2, 0.0},
{0.0, 0.7, 0.3},
{0.4, 0.1, 0.2},
{0.8, 0.5, 0.2},
{0.2, 0.8, 0.5}
};
names = {
"FailCode_0",
"FailCode_1",
"FailCode_2",
"FailCode_3",
"FailCode_4",
"FailCode_5",
"FailCode_6",
"FailCode_7",
"FailCode_8",
"FailCode_9",
"FailCode_10",
"FailCode_11",
"FailCode_12",
"FailCode_13",
"FailCode_14",
"FailCode_15",
"FailCode_16",
"FailCode_17",
"FailCode_18",
"FailCode_19",
"FailCode_20"
};
Eval( Eval Expr(
color table = New Table("Colors",
<<NEW column=""></NEW>//Here is where we set the row-states for the tables to plot. We don't want the bivariate function setting the row states.
table 1 << Update( With( color table ),
Match Columns( :FailCode = :FailCode ),
Add Columns From Update Table( :States )
);
table 1:States << Copy to Row States();
table 1 << Delete Columns( "States" );
<BR />//again for the second table
table 2 << Update( With( color table ),
Match Columns( :FailCode = :FailCode ),
Add Columns From Update Table( :States )
);
table 2:States << Copy to Row States();
table 2 << Delete Columns( "States" );
smart sort = Function( {list, return sort index = 0},
{args, function name, doc string, sorted list, i, j, var, val, ret},
sorted list = {};
For( i = 1, i <= N Items( list ), i++,
j = 0;
var = "";
While( Not( Is Missing( val = Num( Substr( list[i], Length( list[i] ) - j ) ) ) ) & j < Length( list[i] ),
var = val;
j++;
);
sorted list[i] = Eval List( {Substr( list[i], 1, Length( list[i] ) - j ), var, i, j} );
);
sorted list = Sort List( sorted list );
If( return sort index == 0,
For( i = 1, i <= N Items( list ), i++,
list[i] = sorted list[i][1] || Right( Char( sorted list[i][2] ), sorted list[i][4], "0" )
);
,
For( i = 1, i <= N Items( sorted list ), i++,
If( sorted list[i][1] == "BASELINE",
list[sorted list[i][3]] = 0
,
list[sorted list[i][3]] = i
)
);
);
list
);
make bivariate = Function( {table, xcol, ycol, categorical, legend},
{Default Local},
legend items = Smart Sort( Associative Array( Column( table, legend ) ) << Get Keys );
n items = N Items( legend items );
legend marker box = Col Box( "" );
names = {};
For( i = 1, i <= n items, i++,
Eval( Eval Expr(
loc = color table << Get Rows Where( :FailCode == Expr( legend items[i] ) )
) );
// here is a little fun magic to create a legend column out of graph boxes
ob = Outline Box( "",
gb = Graph Box(
Frame Size( 14, 14 ),
Y Scale( 0, 1 ),
X Scale( 0, 1 ),
SuppressAxes,
Marker Seg( [0.5], [0.5], Row States( color table, Matrix( loc ) ) )
)
);
//make sure that all the padding and borders look right
gb[Frame Box( 1 )] << Padding( Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 ) ) << Border( Top, 0 ) << Border( Bottom, 0 ) << Border( Left, 0 ) << Border( Right, 0 ) << Marker Size( 3 ) << SetBackgroundFill( 0 );
gb[Border Box( 1 )] << Left( 0 ) << Top( 0 ) << Right( 0 ) << Bottom( 0 ) << Sides( 0 );
legend marker box << Append( ob );
Insert Into( names, legend items[i] );
);
legend name box = String Col Box( "FailCode", names );
Eval( Eval Expr(
hlb = H List Box(
Platform( table, //need to encapsulate the bivariate in a platform to ensure it uses the correct table
biv = Bivariate(
Y( Column( table, ycol ) ),
X( Column( table, xcol ) ),
By(Column( table, categorical ))
);
)
,
legend box = Table Box(
legend marker box
,
legend name box
)
);
) );
Try( hlb[List Box( 2 )] << Set Horizontal( 1 ) );
legend box << Set Selectable Rows( 1 ) << Set Shade Alternate Rows( 0 ) << Set Shade Cells( 0 ) << Set Shade Headings( 0 ) << Set Column Borders( 0 ) << Set Row Borders( 0 ) << Set Underline Headings( 0 );
If( Num( Trim( Word( 1, JMP Version(), "." ) ) ) > 12,
legend box << Set Column Group Borders( 0 ) << Set Heading Column Borders( 0 );
);
//Lastly we need to set the row change function so that clicking the legend does normal legend things.
Eval( Eval Expr(
legend box << Set Row Change Function(
Function( {this},
table = Expr( table );
items = Expr( legend items );
rows = this << Get Selected Rows();
legend column = Expr( legend );
If( N Rows( rows ) == 0,
table << Clear Select;
Return( 0 );
);
vals = Insert( {}, items[rows] );
Eval( Parse( Eval Insert( "\[
table << Select Where( Contains( ^vals^, :Name("^legend column^") ) )
]\" ) ) )
)
)
) );
hlb
);
Eval( Eval Expr(
New Window( "test",
<<ON close=""></ON>