El gráfico múltiple del eje Y
Este es un gráfico especializado que escala todas las variables del eje y y las superpone y luego proporciona la escala del eje y en las unidades y el rango de la variable. Esto es útil cuando desea superponer 3 o 4 variables que están en diferentes rangos. En la figura anterior, los caudales están en el rango de 0-40 mientras que la potencia está en el rango de 200-1000 y de 100 a 500. Este tipo de gráfico a menudo se usa en aplicaciones científicas y de ingeniería donde múltiples sensores están registrando datos al mismo tiempo, pero el rango de cada sensor es bastante diferente. Por ejemplo, en un ejemplo de fermentación, la glucosa es de 1 a 5 g / dl, el pH es de 6,8 a 7,8, el ácido láctico es de 10 a 50 mmol y el recuento celular o la turbidez es un orden de magnitud mayor. Una manera simple de graficar la relación entre todas las variables a lo largo del tiempo es muy útil para comprender la cinética (o detectar patrones inusuales) del proceso.
Nombres predeterminados hasta aquí (1); dt = tabla de datos actual (); // Esto también podría ser un diálogo, pero está configurado para hacer un complemento de esta manera. //////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////// Expresiones: moví todo esto aquí en lugar de dispersarlos a través del script obj = Expr (// el diagrama del generador de gráficos que es gb gb = dt2 << Generador de gráficos (Tamaño (640, 230), Mostrar título (0), //// optar Mostrar panel de control (0), Posición de leyenda ("Interior izquierdo"), Variables (X (Columna (dt2, 1)), Y (: Datos) , Superposición (: Nombres de columna)), //: La fila debe ser dinámica basada en x o no x en el diálogo. Elementos (Línea (X, Y, Leyenda (7))), SendToReport (Dispatch ({}, "400", LegendBox, {Set Title ("")})), SendToReport (Dispatch ({}, "Graph Builder" , OutlineBox, {Set Title ("Scaled Response Graph")})), SendToReport (Dispatch ({}, "Data", ScaleBox, {Label Row (Show Major Labels (0))})), SendToReport (Dispatch ({ }, "Título Y", TextEditBox, {Establecer texto ("")})))); objwin = Expr (// ventana en la que todo termina en Nueva Ventana ("Gráfico de Respuesta Escalada con Múltiples Y")); objout = Expr (// cuadro de esquema Cuadro de esquema ("Etiquetas del eje Y")); objhlb1 = Expr (cuadro de lista H ("1")); // este tiene los diagramas de eje objhlb2 = Expr (H List Box ("1")); // este tiene el gráfico obj objvlb = Expr (V List Box ("1")); // este tiene out y dt2stackcols = Expr (columnas ()); // nombres de columna para apilar dt2stack = Expr (// la expresión de pila con argumentos. Nota: el argumento de la columna DEBE ser el primero. stack (Columna de etiqueta de origen ("Nombres de columna"), Columna de datos apilados ("Datos"))); //////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////// Diálogo para obtener nombres de columna cd = Diálogo de columna (ylist = ColList ("Y", Min Col (2), Max Col (8), Tipo de datos ("Numérico"), Tipo de modelado ({"Continuo"})), xlist = ColList ("X", Máx. Col (1), Tipo de modelado ({"Continuo", "Respuesta múltiple"}))); Eval (Eval Expr (cd [1])); // eval expr, devuelve lo que está en cd [1], y eval lo hace ejecutar Eval (Eval Expr (cd [2])); // ejecuta por separado solo cd [1], luego ejecuta evalexpr) cd [1], así es como obtengo las variables ylist y xlist ///////////////////// ////////////////////////////////////////////// Tabla de datos estandarizados, y "Axis Boxes" "dt1 = New Table (" multiple y-axis table "); // esta es la tabla donde van los valores estandarizados If (N Items (xlist) == 1, // tenga en cuenta que si hay un columna seleccionada para xlist, luego no se escala Insertar en (ylist, xlist, 1), // llámame loco, pero el primer valor en ylist es la "X", si existe dt1 << Nueva columna (" Row ", formula (Row ()))); For (If (N Items (xlist) == 1, // sip, ese es un argumento" if "dentro de un bucle" for "i = 2; // if an" x "se especifica, luego comience con la segunda cosa en la lista ycol = Como columna (dt, ylist [1]) << obtener valores; dt1 << Nueva columna (Munger (ylist [1], 1,": ", ""), establezca valores (ycol)); // esto es muuuy feo, i = 1), i <= N Items (ylist), i ++, // final de la configuración para el bucle For ycol = As Column (dt, ylist [i]) << obtener valores; yycol = ((yco l - Min (ycol)) / (Max (ycol) - Min (ycol))); dt1 << Nueva columna (Munger (ylist [i], 1, ":", ""), establecer valores (yycol)); // esto es muuuy feo, lo siento mucho amin = Min (ycol); // esta segunda parte de este script está obteniendo valores para hacer los cuadros del eje y amax = Max (ycol); // Necesito los valores min y max de cada una de las columnas sin escala, junto con sus nombres ymin = amin - ((amax - amin) * .1); // El rango del eje de la caja del eje y es 10% más alto y más bajo que el mínimo y el máximo. ymax = amax + ((amax - amin) * .1); // Se ve mejor y está más estrechamente alineado con los datos escalados en gb obj1 = Graph Box (Framesize (0, 230), yName (Char (ylist [i])), Y Scale (ymin, ymax)); // no es un cuadro de eje verdadero, solo un cuadro de gráfico aplastado. el cuadro del eje estaba libre Insertar en (objhlb1, Nombre Expr (obj1)); // aquí se inserta mucho el nombre expr (). es parte de construir expresiones de adentro hacia afuera. ); //////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////// datos estandarizados de la pila para graficar For (If (N Items (xlist) == 1, i = 2, i = 1), i <= N Items (ylist), i ++ , Insertar en (dt2stackcols, ylist [i]);); Insertar en (dt2stack, Name Expr (dt2stackcols), 1); dt2 = dt1 << Eval Expr (dt2stack); eval (sustituto (expr (dt2 = dt1 << ping), expr (ping), evalexpr (dt2stack))); // ¡Esto es complicado! dt2 << nombre del conjunto ("pila múltiple del eje y"); //////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////// Ensamblar todas las partes en la ventana final que se muestra - el orden importa mucho Insertar en (objout, Name Expr (objhlb1)); Insertar en (objvlb, Nombre Expr (objout)); Insertar en (objhlb2, Nombre Expr (objvlb)); Insertar en (objhlb2, Nombre Expr (obj)); Insertar en (objwin, Nombre Expr (objhlb2)); Eval (Eval Expr (objwin)); // Evaluación de todas las partes ensambladas después de evaluar todas las expresiones gb << size (600, 285); // si quieres formatear el gráfico, envía mensajes a gb
Encuentre un conjunto más detallado de notas sobre cómo funciona el script aquí:
https://community.jmp.com/t5/Byron-Wingerd-s-Blog/Multiple-Y-Axis-Graphs/ba-p/52000