Graph Builder: oculta X categorías sin datosHola a todos,
Tengo una tabla con una columna de agrupación y varias variables de respuesta.
New Table( "Test",
Add Rows( 7 ),
New Column( "GROUP",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "f", "g"} )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, ., 6, ., 4, ., 2] )
),
New Column( "Y 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, 6, 2, 3, ., ., .] ),
Set Display Width( 49 )
)
)Me gustaría crear un gráfico de barras con un conmutador de columnas.
Graph Builder(
Size( 527, 448 ),
Show Control Panel( 0 ),
Variables(
X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ),
Y( :Y )
),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} )
)Mi problema es que no quiero mostrar niveles sin datos. En otras palabras, no quiero ver los niveles "b", "d" y "f" para Y y los niveles "e", "f", "g" para Y2.

Intenté utilizar una cláusula "dónde", pero desafortunadamente el conmutador de columnas no la tiene en cuenta.
¿Tiene alguna idea de cómo podríamos hacer eso?
¡Gracias de antemano!
Re: Graph Builder: ocultar X categorías sin datosHola @geoffrey_mann ,
Gracias por su participación y la información adicional.
¡Comenzaré a anunciar la función a mis colegas para obtener votos! 
En cuanto al script, prefiero no afectar la tabla actual, así que creo que el filtro de datos local es una buena opción. Exploraré esta posibilidad más profundamente.
Re: Graph Builder: ocultar X categorías sin datosHola @anne_sa
Me alegro mucho que esto haya ayudado. Es algo que quería hacer desde hace tiempo y ustedes me dieron la motivación. 
Además estoy de acuerdo contigo y @vince_faller que un oyente o una forma de personalizar el comportamiento en torno al conmutador de columnas sería generalmente útil para quienes programan sus propios complementos o cambian el comportamiento. Hacemos esto todo el tiempo en JMP Clinical y JMP Genomics, por eso le doy crédito a @kelci_miclaus y @drewfoglia por el código que tomé prestado.
Si tan solo conociéramos a un gerente de producto de JMP que pudiera ayudar a que esto suceda.
Por favor, ambos voten por la función y les ayudará con la justificación.
En cuanto a los cambios finales, debe tener control sobre el código contenedor que escribió. Las llamadas a la API simplemente están destinadas a reemplazar las variables X e Y. Seguiré agregando funciones para ayudar a los programadores a simplificar el empaquetado de GraphBuilder para que puedan crear complementos más rápido. Lo que intento decir aquí es solo agregar funciones para actualizar GraphBuilder en el archivo API para que cualquier archivo de "controlador" que utilice tenga el comportamiento de selección. Tenga en cuenta que podría haber puesto el dt << clearrowstates(); Llame debajo de las llamadas ReemplazarGB... para organizar el cambio de estados de fila en la tabla en un solo lugar. También tenga en cuenta que este código modifica los estados de las filas de la tabla de datos principal en lugar de utilizar un filtro local para modificar el informe GraphBuilder. Es posible que desee cambiar su enfoque si desea varios informes de la tabla de datos. Pero estas son sólo notas y pretenden ser información adicional para las futuras aplicaciones que pueda crear con JMP.
Observe los estados de fila claros en su archivo de controlador:
dt << clearrowstates();
newvarname = lb<<GETSELECTED></GETSELECTED>
Según mi comprensión "simplista" de lo que está intentando hacer, le recomiendo que simplemente reemplace dt << clearrowstates(); con dt << no excluir (); Déjame saber si ese es el comportamiento que prefieres o si es más complejo que eso.
Re: Graph Builder: ocultar X categorías sin datosestoy totalmente de acuerdo contigo @vince_faller , sería una característica muy buena 
¡Creo que lo agregaré a la lista de deseos de JMP!
Re: Graph Builder: ocultar X categorías sin datosMuchas gracias por estos guiones. @geoffrey_mann
¡Definitivamente es más limpio que lo que hice!
Sólo hay una cosa que me gustaría adaptar: cada vez que seleccionamos una nueva variable en el cuadro de lista, el estado de la fila se restablece. Así si algunos puntos han sido etiquetados/excluidos/coloreados... perderemos esta información y puede resultar molesto.
De lo contrario, cumple con mis expectativas, ¡así que gracias de nuevo!
Re: Graph Builder: ocultar X categorías sin datosSería genial si el cambio de columna tuviera un mensaje <Re: Graph Builder: ocultar X categorías sin datos
Hola de nuevo @anne_sa ,
Perdón por el retraso, de hecho cogí gripe durante unos días y me atrasé un poco.
He adjuntado dos archivos. El primer archivo jsl (Script de ejemplo para cambiar los estados de fila.jsl) es el archivo del controlador y la ruta en la segunda línea es la ruta completa de la ubicación donde coloca el segundo archivo (GraphBuilderJSLAPI.jsl).
//Include script to modify GraphBuilder with some special functions defined
include(ConvertFilePath("/Users/gemann/Projects/Prototypes/JSLClasses/GraphBuilderJSLAPI.jsl", absolute, windows));
//Create a sample table
dt = New Table( "Test",
Add Rows( 7 ),
New Column( "GROUP",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "f", "g"} )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, ., 6, ., 4, ., 2] )
),
New Column( "Y 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [7, 6, 2, 3, ., ., .] ),
Set Display Width( 49 )
)
);
//Add a new window and build a listbox beside a graphbuilder
New Window( "CustomColumnSwitcher Window",
//Start by getting all of the columns in the current datatable
CNames = dt << Get Column Names( Numeric );
Show( CNames );
//User a horizontal layout
HListBox(
//Use a ListBox as the new Column Switcher
lb = List Box(
CNames,
maxSelected(1),
//The next lines specify the script that gets run when an item in listbox is selected
dt << clearrowstates();
newvarname = lb<<GETSELECTED></GETSELECTED>
Buena suerte y avísame si tienes algún problema. ¡¡¡Por supuesto que estos archivos no están completamente probados!!! 
Re: Graph Builder: ocultar X categorías sin datosHola @geoffrey_mann ,
He escrito algo para básicamente actualizar el conmutador de columnas y cambiar la configuración del eje (como lo sugiere @Julian ) cada vez que seleccionamos una nueva variable. Sin embargo, puede que no sea muy eficiente, por lo que, por supuesto, su solución me interesa mucho.
Re: Graph Builder: ocultar X categorías sin datosHola Ana,
Quería volver a consultar con usted para ver si ha encontrado una solución de codificación para su problema. Me tomó un tiempo encontrar tiempo, pero tengo una solución de codificación si aún la necesitas.
Re: Graph Builder: ocultar X categorías sin datosHola @Julian !
¡Realmente aprecio sus esfuerzos para resolver mi problema! Desafortunadamente, el número de niveles no faltantes puede ser diferente de una variable de respuesta a la siguiente. Sin embargo, su última publicación definitivamente se puede utilizar para la "solución de codificación". Cambiar la configuración del eje según el número de nivel es de hecho una buena manera de mostrar lo que se espera. Trabajaré en esa dirección. ¡Gracias por tu ayuda!
Re: Graph Builder: ocultar X categorías sin datosHola @anne_sa ,
Entiendo exactamente lo que quieres decir. Realmente podría reducirse a codificar algo personalizado, pero permítanme intentarlo de forma interactiva más. ¿Hay siempre sólo cuatro niveles (aunque diferentes) de Grupo para cada Y? Si es así, aquí hay un truco potencial: Graph Builder mantendrá el eje X al cambiar de columna, y dado que sus niveles están ordenados de forma ascendente (por lo tanto, los niveles en blanco siempre están al final), podríamos ajustar el eje para que solo se muestren cuatro niveles. . Puede hacer esto en la configuración del eje (haga clic con el botón derecho en el eje > configuración del eje), o simplemente arrastrando el extremo del eje hasta que se oculten los niveles que faltan).
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ), Y( :Y ) ),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} ),
SendToReport( Dispatch( {}, "GROUP", ScaleBox, {Min( -0.5 ), Max( 3.5 ), Inc( 1 ), Minor Ticks( 0 )} ) )
);

¿Quizás una posible solución en su caso?
@Julian
Re: Graph Builder: ocultar X categorías sin datosGracias @Julian por esta sugerencia! De hecho, permite mostrar sólo niveles con datos.
El único problema (aunque quizás pido demasiado) es que perdemos el vínculo entre filas. Por ejemplo, si selecciono el nivel "a" para Y y quiero ver el valor correspondiente para Y2, no se resalta nada cuando selecciono Y2 con el filtro de datos local.
Quizás codificar el comportamiento esperado sea la solución...
Re: Graph Builder: ocultar X categorías sin datosHola @anne_sa ,
Como descubrió, Graph Builder observa esas categorías de su variable de agrupación y realmente insistirá en trazarlas (lo cual suele ser algo bueno), ya que supone que encuentra valor en ellas desde que las mantuvo en su tabla. En su caso con el conmutador de columnas, no es tan simple como simplemente eliminar esas filas, ya que para las otras columnas los datos sí existen. Una solución es reestructurar sus datos para poder eliminar las filas que faltan. Yo haría esto apilando:
Tablas > Pila
Data Table( "Test" ) << Stack(
columns( :Y, :Y 2 ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" )
);
Esto devolverá una tabla como la siguiente:

Elimine los valores que faltan haciendo clic derecho en cualquiera de las celdas que faltan> seleccione coincidencia. Luego, elimine esas filas. Esto devuelve la tabla adjunta. Ahora, haga su gráfico pero use un filtro de datos local en lugar de un conmutador de columnas para seleccionar lo que anteriormente era una respuesta de su columna de etiqueta:
Graph Builder(
Show Control Panel( 0 ),
Variables( X( :GROUP ), Y( :Data ) ),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Local Data Filter(
Add Filter(
columns( :Label ),
Where( :Label == "Y" ),
Display( :Label, Size( 160, 17 ) )
)
)
);

Dado que no faltan filas, Graph Builder muestra solo aquellos niveles de Grupo que están llenos de datos.Por supuesto, puede generalizar esto a cualquier número de niveles de Y; simplemente apílelos todos en el paso inicial.
¡Espero que esto ayude!
@Julian
Re: Graph Builder: ocultar X categorías sin datosHola Ana,
Veo tu problema ahora y todavía lo estoy echando un vistazo. Creo que este requerirá un poco de codificación.Re: Graph Builder: ocultar X categorías sin datosGracias por tu respuesta @geoffrey_mann
Desafortunadamente, no es exactamente lo que me gustaría obtener porque cuando selecciono una nueva columna con el conmutador de columnas, el filtro de datos local todavía se basa en Y.
Por supuesto, es posible cambiar manualmente el filtro de datos local, pero como puedo tener una cantidad bastante alta de variables, sería genial tener una forma automática de hacerlo 
Re: Graph Builder: ocultar X categorías sin datosHola Ana,
Su idea de que necesita una cláusula "dónde" o más bien un filtro de algún tipo es correcta. Intente agregar la siguiente línea a su script de construcción de gráficos:
Local Data Filter( Add Filter( columns( :Y ), Where( :Y >= 2 & :Y <= 7 ) ) )
Espero que un filtro de datos local esté bien.
Graph Builder(
Size( 527, 448 ),
Show Control Panel( 0 ),
Variables(
X( :GROUP, Order By( :Y, Ascending, Order Statistic( "Mean" ) ) ),
Y( :Y )
),
Elements( Bar( X, Y, Legend( 4 ) ) ),
Column Switcher( :Y, {:Y, :Y 2} ),
Local Data Filter( Add Filter( columns( :Y ), Where( :Y >= 2 & :Y <= 7 ) ) )
);
Re: Graph Builder: ocultar X categorías sin datosEs una publicación antigua pero aún así podría ser de ayuda:
Además, puede utilizar un filtro de datos local con selección de valores faltantes e inversos para la Y respectiva.
Local Data Filter(
Inverse( 1 ),
Add Filter( columns( :Y1, :Y2 ), Select Missing( :Y2 ) )
),
Column Switcher( :Y2, {:Y1, :Y2, :Y3} )
Además, puede agregar un evento para el evento al seleccionar otro nivel del conmutador de columnas, lo que luego cambia la configuración del filtro del conmutador de datos local para todas las variables Y de interés. Puede que sea una ingeniería excesiva, pero podría funcionar.
Re: Graph Builder: ocultar X categorías sin datosHola @martindemel ,
Gracias por tu mensaje. Aunque es una publicación bastante antigua, siempre es bueno descubrir diferentes maneras de alcanzar el mismo objetivo.