/*""" JSL en Graph Builder Autor: jthi Fecha de creación: 2024-09-18 Versión de JMP de creación: JMP Pro 18.0.1 Este es solo un pequeño adelanto de lo que se puede crear en el generador de gráficos. Esto también se superpondrá parcialmente con la creación de scripts de gráficos en general """*/ Nombres predeterminados Aquí(1); dt = Open("$SAMPLE_DATA/Big Class.jmp"); stop(); // para evitar que el script se ejecute hasta el final mientras se agrega aquí el alcance /*""" Mejorando el script creado por JMP """*/ // JMP creó un script simple para el generador de gráficos // Instantánea del informe: Big Class - Graph Builder Data Table("Big Class") << Graph Builder( Size(525, 454), Show Control Panel(0), Variables(X(:weight), Y(:height)), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ); // Eliminar comentarios innecesarios, agregar referencia a su tabla y almacenar referencia a una variable // La abreviatura común es gb para Graph Builder gb = dt << Graph Builder( Size(525, 454), Show Control Panel(0), Variables(X(:weight), Y(:height)), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ); /*""" Reemplazar dinámicamente una sola columna """*/ // NOTA: Siempre almaceno mi columna "referencias" como cadenas de los nombres de las columnas // Esta es la opción más flexible (y robusta) en mi opinión, pero tendrá que saber // cómo modificarlas en otros formatos si es necesario group_col = "age"; gb = dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(group_col)), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ); // Eval() es suficiente gb = dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(Eval(group_col))), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ); // Puedes tomar una ruta más complicada Y a veces esto es útil (crear expresiones) // Generalmente mi método preferido EvalExpr gb_expr1 = EvalExpr( dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(Expr(NameExpr(AsColumn(dt, group_col))))), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ) ); //pero puedes usar Sustituto gb_expr2 = Sustituto( Expr(dt << Generador de gráficos( Mostrar panel de control(0), Variables(X(:peso), Y(:altura), Página(_groupcol_)), Elementos(Puntos(X, Y, Leyenda(3)), Suavizado(X, Y, Leyenda(4))) )), Expr(_groupcol_), NombreExpr(AsColumn(dt, group_col)) ); // Ejecutando (puede agregar Eval antes de EvalExpr() si solo desea crear el gráfico gb = Eval(gb_expr1); // Nota: ya ha evaluado la expresión -> groupcol no se actualizará group_col = "sex"; gb = Eval(gb_expr1); // Hay muchas opciones para manejar esto, crear una función, usar expresión, ... gb_expr3 = Expr(EvalExpr( dt << Graph Builder( Show Control Panel(0), Variables(X(:weight), Y(:height), Page(Expr(NameExpr(AsColumn(dt, group_col))))), Elements(Points(X, Y, Legend(3)), Smoother(X, Y, Legend(4))) ) )); group_col = "age"; gb = Eval(gb_expr3); group_col = "sex"; gb = Eval(gb_expr3); /*""" Nota: Graph Builder es plataforma complicada """*/ gb = dt << Graph Builder( Size(525, 448), Show Control Panel(0), Variables(X(:sex)), Elements(Bar(X, Legend(3))) ); Report(gb) << show properties(); Report(gb) << Show Tree Structure; nw = New Window("gbscript", << type("Script"), << Language("XML"), Report(gb) << Get XML ); // Es posible que no pueda acceder a todo directamente desde el informe de Graph Builder // y es posible que tenga que utilizar la tabla de datos (por ejemplo, grupos) // Si accede a los valores de la tabla, recuerde que el orden puede ser diferente gb = dt << Graph Builder( Size(599, 566), Show Control Panel(0), Variables(X(:sex), Group X(:age)), Elements(Bar(X, Legend(3))) ); // Report(gb)[GraphBuilderGroupBox(1)] << Select(1); Report(gb)[GraphBuilderGroupBox(1)] << get xml; // Puede intentar analizar grupos de 121314151617age // Recuerde los tipos de datos y el ordenamiento Column(dt, "age") << Set Property( "Value Order", {Custom Order({17, 16, 15, 14, 13, 12}), Common Order(0)} ); Summarize(dt, groups1 = By(:age)); /// orden considerado (al menos en este caso) groups2 = Associative Array(Column(dt, "age")) << get keys; // no considerado dt_summary = dt << Summary( Group(:age), Freq("None"), Weight("None"), Link to original data table(0), output table name("Groups"), Private ); groups3 = dt_summary[0, 1]; Close(dt_summary, no save); show(groups1, groups2, groups3); /*""" Buscando objeto generador de gráficos desde la ventana """*/ // No se puede confiar en el texto del cuadro de esquema del generador de gráficos ya que se puede cambiar // -> Utilizar el atributo helpKey xml // Referencias a cuadros de esquema en el informe actual (pueden ser múltiples) obs = Current Report() << XPath("//OutlineBox[
@helpKey = 'Graph Builder']"); gbs = obs << Get Scriptable Object; // referencias a generadores de gráficos // Ejemplo completo de búsqueda de un solo generador de gráficos desde el informe actual obs = Current Report() << XPath("//OutlineBox[
@helpKey = 'Graph Builder']"); gbs = obs << Get Scriptable Object; // referencias a generadores de gráficos If(N Items(obs) < 1, Throw("No graph builder found"); ); gb = obs[1] << get scriptable object; gb << Get Data Table; // ... y así sucesivamente /*""" Cambiar diferentes partes del generador de gráficos """*/ // Cambiar algunas cosas es muy simple dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Size(599, 566), Show Control Panel(0), Variables(X(:sex), Group X(:age)), Elements(Bar(X, Legend(3))) ); gb << Title("MI NUEVO TÍTULO"); // Cambia el cuadro de contorno // ¿Qué tal el texto debajo del cuadro de contorno ("título del gráfico") gb << Subtitle("Prueba"); // no gb << Show Subtitle(1); // XPath tebs = Report(gb) << XPath("//GraphBuilderTitleBox/TextEditBox"); tebs[1] << Set Text("Antes del subtítulo"); // O subíndices de informes (prefiero XPath) Report(gb)[GraphBuilderTitleBox(1), TextEditBox(1)] << Set Text("Before Subtitle2"); // También se puede modificar con Dispatch pero personalmente no me gusta usarlos // La sintaxis es difícil de entender en mi opinión (qué es "título de gráfico", por ejemplo) Report(gb) << Dispatch({}, "título de gráfico", TextEditBox, {Set Text("BEFORE SUBTITLE")}); /* nw = New Window("gbscript", << type("Script"), << Language("XML"), Current Report() << Get XML ); */ // AxisBox dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Size(599, 566), Show Control Panel(0), Variables(X(:sex), Group X(:age)), Elements(Bar(X, Legend(3))) ); // ScaleBox podría hacer lo mismo (o no) Yo prefiero usar AxisBox rep = Report(gb); // Títulos de los ejes // Dispatch es la opción más fácil Report(gb) << Dispatch({}, "Título Y", TextEditBox, {Set Text("Mi eje Y")}); Report(gb) << Dispatch({}, "Título X", TextEditBox, {Set Text("Mi eje X")}); // Nota: si tiene agrupación, etc., potencialmente podrá tener múltiples cuadros de marco y cuadros de eje rep[AxisBox(1)] << Select(1); // Primer eje X rep[AxisBox(2)] << Select(1); // Eje Y rep[AxisBox(3)] << Select(1); // Segundo eje X // Aprende a navegar por estos abs = rep << XPath("//AxisBox"); yaxis = Remove From(abs, 2)[1]; yaxis << select(1); // abs queda con solo referencias del eje x yaxis << Min(-1) << Max(10); abs << Min(1); // puedes verificar desde la configuración del eje cómo va la escala para datos categóricos // En el generador de gráficos, el "índice" comienza desde 0, pero no es lo mismo para todas las plataformas abs << Min(-0.5) << Max(1.5); // FrameBoxes dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Size(599, 566), Show Control Panel(0), Variables(X(:sex), Group X(:age)), Elements(Bar(X, Legend(3))) ); // ScaleBox podría hacer lo mismo (o no) Prefiero usar AxisBox rep = Report(gb); fbs = rep << XPath("//FrameBox"); firstfb = fbs[1]; // Si desea tener scripts gráficos, debe configurarlos como frameboxes firstfb << Add Graphics Script( H Line(3); ); // Recuerde que si usa variables, es posible que desee evaluarlas de una forma u otra ref = 2; firstfb << Add Graphics Script( H Line(ref); ); ref = 3; gb << Reshow; refy = 1; Eval(EvalExpr( firstfb << Add Graphics Script( V Line(Expr(refy)); ); )); refy = 0; gb << Reshow; vals = 1::7; fbs[2] << Add Graphics Script( For(i = 1, i <= N Items(vals), i++, H Line(vals[i]) ); ); gb << reshow; vals2 = 1::7; fbs[3] << Agregar secuencia de comandos de gráficos( Para cada({val}, vals2, H Line(val) ); ); vals2 = .; gb << reshow; vals3 = 1::7; Eval(EvalExpr( fbs[4] << Agregar secuencia de comandos de gráficos( myvals = Expr(vals3); Para cada({val}, myvals, H Line(val); ); ); )); gb << reshow; // Los segmentos pueden tener información interesante // O puedes manipular gráficos a través de ellos gb = dt << Generador de gráficos( Tamaño(525, 454), Mostrar panel de control(0), Variables(X(:peso), Y(:altura)), Elementos( Puntos(X, Y, Leyenda(3)), Barra(X, Y, Leyenda(5)) ) ); segs = Report(gb)[FrameBox(1)] << Buscar segmentos(); segs << nombre de clase; ms = Report(gb)[FrameBox(1)] << Find Seg(MarkerSeg(1)); xs = ms << Obtener valores X; ys = ms << Obtener valores Y; // ms << Obtener punto(1); // ms << Obtener marcadores; // ms << Obtener números de fila; // lástima que esto no funcione en el generador de gráficos // Pruebe qué sucede si no utiliza el rango usando el orden predeterminado o eliminando [order] //order = 1::N Items(xs); order = Rank(xs); Eval(EvalExpr( Report(gb)[FrameBox(1)] << Agregar script de gráficos( Color del lápiz("Azul"); Línea(Expr(xs[order]), Expr(ys[order])); ); )); // Construir dinámicamente un generador de gráficos // Podría funcionar como ejemplo //
https://community.jmp.com/t5/JMP-Add-Ins/Column-Quick-Swapper-easily-change-multiple-Y-and-X-axis-columns/ta-p/724616 gb = dt << Generador de gráficos( Tamaño(525, 454), Mostrar panel de control(0), Variables(X(:weight), Y(:height)), Elementos( Puntos(X, Y, Legend(3)), Barra(X, Y, Legend(5)) ) ); gb << Agregar variable({:age, Rol("Wrap")}); gb << Eliminar variable(1); gb << Eliminar variable(1); gb << Eliminar variable(1); gb << Agregar variable({:height, Rol("Y")}); gb << Agregar variable({:weight, Rol("X")}); gb << Add Variable({:weight, Role("X")}); gb << Add Variable({:weight, Role("X"), Position(1)}); // Los índices/posiciones pueden ser muy confusos con estos gb << Add Element(1, 1, {Type("Line Of Fit"), X, Y, Degree("Quadratic")}); gb << Remove Element(1, 1, 2); // Ejemplo, deseamos construir un gráfico basado en las entradas del usuario // No sabemos cuántos ejes Y nos proporciona el usuario // pero tenemos un eje X estático dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp"); // Verifique cómo se vería el script creado por JMP con 1 y múltiples columnas // si desea ejes anidados/separados, pruebe eso también // Una columna gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), Variables(X(:SITE), Y(:NPN1)), Elements(Points(X, Y, Legend(3))) ); // Múltiples columnas en el mismo eje gb = dt << Graph Builder( Show Control Panel(0), Variables(X(:SITE), Y(:NPN1), Y(:PNP1, Position(1)), Y(:PNP2, Position(1))), Elements(Points(X, Y(1), Y(2), Y(3), Legend(4))) ); // Eje separado gb = dt << Generador de gráficos( Mostrar panel de control(0), Variables(X(:SITE), Y(:NPN1), Y(:PNP1), Y(:PNP2)), Elementos(Posición(1, 1), Puntos(X, Y, Leyenda(19))), Elementos(Posición(1, 2), Puntos(X, Y, Leyenda(20))), Elementos(Posición(1, 3), Puntos(X, Y, Leyenda(21))) ); // Ahora tienes que descubrir cómo construir esto // Hay al menos dos enfoques // Construir la expresión O utilizar << add variable + << Add element // Usando add variable/element // Con estos a veces puedes confiar en que JMP agregue "la mayor parte" del script // Eje Y separado // Crear gráfico inicial gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), Variables(X(:SITE)), Elements(Points(X, Y, Legend(3))), Invisible ); ycols = {"NPN1", "NPN2", "NPN3"}; For Each({ycol, idx}, ycols, Eval(EvalExpr( gb << Add Variable({Expr(NameExpr(AsColumn(dt, ycol))), Role("Y")}); )); ); gb << reshow; gb << Show Window(1); // mostrar cuando esté listo wait(0); // Mismo eje Y gb = dt << Graph Builder( Size(528, 448), Show Control Panel(0), Variables(X(:SITE)), Elements(Points(X, Y, Legend(3))) ); ycols = {"NPN1", "NPN2", "NPN3"}; For Each({ycol, idx}, ycols, Eval(EvalExpr( gb << Add Variable({Expr(NameExpr(AsColumn(dt, ycol))), Role("Y"), Position(1)}); )); ); // Generación de expresión variables_expr = Expr(Variables(X(:SITE))); Para cada ({ycol, idx}, ycols, cur_expr = Eval Expr (Y (Expr (Name Expr (AsColumn (dt, ycol))))); Insertar en (variables_expr, Name Expr (cur_expr)); ); mostrar (variables_expr); Eval (Sustituir (Expr (gb = dt << Generador de gráficos (Size (528, 448), Mostrar panel de control (0), _variables_)), Expr (_variables_), Name Expr (variables_expr))); // Esto funciona como puntos, es el valor predeterminado en el generador de gráficos, pero generalmente es necesario generarlo más. Ejemplo con diferentes ejes iguales /* gb = dt << Graph Builder( Mostrar panel de control(0), Variables(X(:SITE), Y(:NPN1), Y(:NPN2, Position(1)), Y(:NPN3, Position(1))), Elementos(Línea(X, Y(1), Y(2), Y(3), Leyenda(4))) ); */ ycols = {"NPN1", "NPN2", "NPN3", "NPN4", "NPN5"}; variables_expr = Expr(Variables(X(:SITE))); lines_expr = Expr(Line(X)); Para cada ({ycol, idx}, ycols, cur_expr = Eval Expr(Y(Expr(Nombre Expr(AsColumn(dt, ycol))), Posición(1))); Insertar en(variables_expr, Nombre Expr(cur_expr)); cur_expr2 = Eval Expr(Y(Expr(idx))); Insertar en(lines_expr, Nombre Expr(cur_expr2)); ); Eval(Sustituir( Expr(gb = dt << Generador de gráficos( Tamaño(528, 448), Mostrar panel de control(0), _variables_, Elementos(_lines_) )), Expr(_variables_), Nombre Expr(variables_expr), Expr(_lines_), Nombre Expr(lines_expr) )); // Un ejemplo de la comunidad Web("
https://community.jmp.com/t5/The-Plot-Thickens/Reply-All-How-to-script-dynamic-content-for-Graph-Builder/ba-p/21092", JMP Window); // Hay muchos trucos relacionados con estos, pero no hay tiempo para comenzar a cubrirlos en esta sesión // La documentación también es muy deficiente para estos... // Consulte la función GraphBuilderBox / Graph Builder desde el índice de scripts para ver algunas posibilidades Open Help( "Scripting Index", Search(Term("Graph Builder"), Match({"Contiene términos", "Coincidir con todos los términos", "Ignorar mayúsculas y minúsculas"})), IndexContext( Category("Todas las categorías"), Object("Resultados de la búsqueda"), Method("Agregar elemento") ) ); // manipular el generador de gráficos dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Variables(X(:height), Y(:weight)), Elements(Points(X, Y), Smoother(X, Y)) ); // Cambiar la estadística de resumen gb << Update Element(1, 1, 1, {Summary Statistic("Mean"), Error Bars("Range")}); // A veces es posible que desee manipular directamente desde la interfaz de usuario cbs = Report(gb) << XPath("//ComboBox"); cbs[1] << get items; cbs[1] << Set(2); // Establecer la estadística de resumen en "N" (segunda opción) cbs[1] << Set(Contains(cbs[1] << get items, "Mean")); // Una de las preguntas más frecuentes en la comunidad JMP // Agregar líneas a sus gráficos // Algunos de estos métodos se aplican a más que el generador de gráficos, pero no a todos dt = Open("$SAMPLE_DATA/Big Class.jmp"); // Ejemplo muy simple gb = dt << Graph Builder( Size(525, 490), Show Control Panel(0), Variables(X(:age), Y(:height), Group X(:sex)), Elements(Points(X, Y, Legend(1))) ); // "límites" de altura diferentes para F y M aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; // No siempre tienes que depender de scripts, la opción más fácil (dependiendo de tus datos) // es utilizar la tabla de datos. Para datos anchos/divididos es posible que puedas utilizar límites de especificaciones. // Para datos altos, agrega una línea a tu gráfico newcol1 = dt << New Column("Low", Numeric, Continuous, Formula( aa_limits[:sex][1]; )); newcol2 = dt << New Column("High", Numeric, Continuous, Formula( aa_limits[:sex][2]; )); dt << ejecutar fórmulas; newcol1 << Eliminar fórmula; newcol2 << Eliminar fórmula; // Observe cómo se han establecido las variables en puntos y líneas gb = dt << Graph Builder( Size(570, 762), Variables( X(:age), Y(:height), Y(:Low, Position(1)), Y(:High, Position(1)), Group X(:sex) ), Elements(Points(X, Y(1), Legend(1)), Line(Y(2), Y(3), Legend(4))), SendToReport( Dispatch({"Points"}, "", OutlineBox, {Close(0)}), Dispatch({"Line"}, "", OutlineBox, {Close(0)}) ) ); // Lo bueno de esto es que admite fácilmente varios tipos de gráficos // y funciona fácilmente con filtros de datos locales // También puede usar Caption para crear líneas, pero es posible que no funcione tan bien con X-group // Scripting: use líneas de referencia dt = Open("$SAMPLE_DATA/Big Class.jmp"); gb = dt << Graph Builder( Size(525, 744), Show Control Panel(0), Variables( X(:age), Y(:height), Page(:sex) ), Elements(Points(X, Y(1), Legend(1))) ); // diferentes "límites" de altura para F y M aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; // Tenemos varios gráficos (usamos Page) Summarize(dt, groups = By(:sex)); fbs = gb << XPath("//AxisBox"); yaxes = fbs[2::N Items(fbs)::2]; For Each({yaxis, idx}, yaxes, vals = aa_limits[groups[idx]]; yaxis << Add Ref Line(vals[1], "Discontinua", "Roja", "baja", 1); yaxis << Add Ref Line(vals[2], "Discontinua", "Roja", "alta", 1); ); // Scripting - usar script gráfico // Con múltiples cuadros de marco y grupos, esto puede complicarse rápidamente gb = dt << Graph Builder( Size(525, 490), Show Control Panel(0), Variables(X(:age), Y(:height), Group X(:sex)), Elements(Points(X, Y, Legend(1))) ); aa_limits = ["F" => {50, 65}, "M" => {55, 70}]; dt_groups = dt<< Resumen( Grupo(:sexo), N Categorías(:edad), Frecuencia("Ninguno"), Peso("Ninguno"), Enlace a la tabla de datos original(0), nombre de la tabla de salida("grupos"), invisible ); grupos = dt_groups[0, [1 3]]; Cerrar(dt_groups, no guardar); fbs = gb << XPath("//FrameBox"); total_groups = 0; Para cada ({fb, idx}, fbs, Eval(EvalExpr( fb << Agregar secuencia de comandos de gráficos( límites = Expr(aa_limits[groups[idx][1]]); grupo_inicial = 0; grupos_totales = grupo_inicial + Expr(groups[idx][2]); Color del lápiz("Rojo"); Línea({grupo_inicial - 1, límites[1]}, {grupos_totales, límites[1]}); Color del lápiz("Azul"); Línea({grupo_inicial - 1, límites[2]}, {grupos_totales, límites[2]}); ); )); ); // Gráficos de variabilidad y líneas para obtener más ejemplos Web("
https://community.jmp.com/t5/Discussions/Agregar-lineas-de-referencia-a-varios-gráficos-de-variabilidad-en-una-columna/td-p/722908", Ventana JMP); Web("
https://community.jmp.com/t5/Discussions/different-spec-limits-on-a-variability-chart/td-p/565177", JMP Window); Web("
https://community.jmp.com/t5/Discussions/Varying-spec-limits-by-data-category-in-variability-chart/td-p/723027", JMP Window); /*""" No cubierto debido a limitaciones de tiempo """*/ // Filtro de datos locales // Puede causar algunos problemas a medida que se reconstruyen los cuadros de marco, Web("
https://community.jmp.com/t5/Discussions/How-to-set-a-Reference-Line-on-each-page-with-Page-option-in/mp/798517", "JMP Window"); // Cambiador de columnas // Etiqueta flotante Web("
https://www.jmp.com/support/help/es/18.0/index.shtml#page/jmp/work-with-the-hover-label-execution-context.shtml#ww599987"); // Servidor de leyenda // Diferentes controladores de estado // Configuración de imágenes en el gráfico Write();