establecer el color de la fila según los valores RGB dadosHola, estoy intentando establecer el color de la fila (no el color de la celda) según los valores RGB dados en mis columnas. Sin embargo, no puedo obtener el bucle correcto para asignar los colores personalizados que quiero. ¿Alguien podría ayudar?
Código y tabla de datos adjuntos. ¡Gracias!
// Get the current data table
dt = Current Data Table();
// Initialize the color lists
RedList = Column(dt, "Red") << Get Values;
GreenList = Column(dt, "Green") << Get Values;
BlueList = Column(dt, "Blue") << Get Values;
// Ensure we do not exceed the number of rows or the number of items in any color list
minLength = Min( N Rows(dt), N Items(RedList), N Items(GreenList), N Items(BlueList) );
// Loop to set the row colors
For( i = 1, i <= minLength, i++,
// Clear any previous selections
dt << Clear Select;
// Select the current row
dt << Select Where( Row() == i );
// Set the row color
dt << Set Row Colors( RedList[i], GreenList[i], BlueList[i] );
);
Automatización y secuencias de comandosRe: establecer el color de la fila según los valores RGB dadosEsto será un poco lento debido a que se están realizando todas las selecciones.
Names Default To Here(1);
dt = Current Data Table();
dt << show window(0);
For Each Row(dt,
dt << Clear Select;
dt << Select Rows(Row());
dt << Colors(RGB Color(Eval List({:Red, :Green, :Blue}) / 255));
);
dt << show window(1);
Si se requiere más velocidad, se puede hacer más rápido seleccionando varias filas (todas las filas que tengan un color específico al mismo tiempo) o estableciendo estados de fila.
Names Default To Here(1);
dt = Current Data Table();
Summarize(dt, uniq = By(:Color), r = Min(:Red), g = Min(:Green), b = Min(:Blue));
For Each({cur_color, idx}, uniq,
dt << Select Where(:Color == cur_color);
dt << Colors(RGB Color(Eval List({r[idx], g[idx], b[idx]}) / 255));
dt << Clear Select;
);

¡Buena foto!
Editar:
Se me ocurrió que también puedes usar la tabla Resumen para configurar los colores.
Names Default To Here(1);
dt = Current Data Table();
dt_summary = dt << Summary(
Group(:Color),
Mean(:Red),
Mean(:Green),
Mean(:Blue),
Freq("None"),
Weight("None"),
statistics column name format("column")
);
For Each Row(dt_summary,
dt_summary << Select Rows(Row());
dt_summary << Colors(RGB Color(Eval List({:Red, :Green, :Blue}) / 255));
dt_summary << Clear Select;
);
Close(dt_summary, no save);
Edit2: una opción más que recorre toda la tabla pero sin selecciones
Names Default To Here(1);
dt = Current Data Table();
For Each Row(dt,
Row State(Row()) = Color State(Eval List({:Red, :Green, :Blue} / 255));
);
No pude descubrir cómo convertir el estado de color (por ejemplo, estado de color (-15527920)) a número (debería ser 512.925536155701), por lo que podría haber creado una matriz de estado de fila y usar << Establecer estados de fila.
Re: establecer el color de la fila según los valores RGB dados¡Gracias! ¡Estas soluciones son verdaderamente efectivas y eficientes!
Re: establecer el color de la fila según los valores RGB dados2 cosas
- La sintaxis para configurar el color del estado de la fila era incorrecta.
- El uso de Select Where() hizo que el bucle fuera muy lento.
Aquí está mi modificación.
// Get the current data table
dt = Current Data Table();
// Initialize the color lists
RedList = Column(dt, "Red") << Get Values;
GreenList = Column(dt, "Green") << Get Values;
BlueList = Column(dt, "Blue") << Get Values;
// Ensure we do not exceed the number of rows or the number of items in any color list
minLength = Min( N Rows(dt), N Items(RedList), N Items(GreenList), N Items(BlueList) );
// Loop to set the row colors
For( i = 1, i <= minLength, i++,
// Clear any previous selections
dt << Clear Select;
// Select the current row
dt << Select rows( i );
// Set the row color
dt << Colors( rgb color(redlist[i],greenlist[i],bluelist[i]) );
);Re: establecer el color de la fila mediante valores RGB dadosDisculpen que reviva una publicación antigua, pero acabo de descubrir algo nuevo sobre esto después de batallar un rato. También intenté convertir estados de color a números sin éxito. En cambio, encontré una forma aún más rápida, ya que evita los bucles. Parece un truco, pero crear una columna de fórmula y luego dejar que JMP use la función integrada para copiar los estados de esas filas fue significativamente más rápido que la versión Edit2 de @jthi , que ya era muy rápida.
(dt << new column ("Color", formula (color state (RGB color (:R, :G, :B))))) << copy to row states;