How can you show the RGB color coordinates of crayons in an interesting way using JMP? (Image copyright James A. Alloway, Jr. Used with permission.)How can you show the RGB color coordinates of crayons in an interesting way using JMP? (Image copyright James A. Alloway, Jr. Used with permission.)How can you show the RGB color coordinates of crayons in an interesting way using JMP? (Image copyright James A. Alloway, Jr. Used with permission.)How can you show the RGB color coordinates of crayons in an interesting way using JMP? (Image copyright James A. Alloway, Jr. Used with permission.)Come puoi mostrare le coordinate cromatiche RGB dei pastelli in modo interessante utilizzando JMP? (Copyright dell'immagine James A. Alloway, Jr. Usato con permesso.)
La borsa della posta ingegneristica
Episodio 2: Vedo i tuoi veri colori
Di tanto in tanto, gli ingegneri di sistema di JMP si imbattono in domande interessanti che esulano in qualche modo dalla gamma tipica di JMP utilizzo. Queste applicazioni sono generalmente intelligenti e portano a casa come l'utilizzo dei dati non sia solo per problemi aziendali o tecnici. Di seguito è riportato un esempio di un altro collega dello stato di New York che ho pensato sarebbe stato divertente condividere.
Jim stava cercando di analizzare i dati su 150 pastelli Crayola come parte di un lavoro di volontariato. Sperava di mostrare agli studenti fantastiche visualizzazioni di dati che avrebbero suscitato il loro interesse per STEAM (Scienza, tecnologia, ingegneria, arte e design e matematica).
La domanda
Ciao, Mike [JMP],
Finalmente ho una domanda per te. Sto creando un set di dati per una presentazione STEAM. Per la parte Arte e Design, ho i dati sui pastelli Crayola (150 righe). Sto cercando di creare una trama ternaria usando le coordinate del colore (R, G,
, che ho per ogni riga (colore). Posso creare la trama senza difficoltà, ma voglio che ogni indicatore sulla trama sia il colore effettivo rappresentato in ogni riga. Sono stato in grado di farlo a mano, ma presumo ci debba essere un modo più semplice (senza dover scrivere una sceneggiatura).
Qualsiasi guida in questa direzione sarebbe apprezzata! (Non c'è fretta a questo punto.)
Grazie.
Jim [Utente]
La mia risposta
Prova questo.
Beh... è stato uno scambio informativo, vero?
Questo è un esempio di uno di quei rari casi in cui l'unico modo per mostrare qualcuno Come fare qualcosa è effettivamente fare per loro. In genere non sono un fan di farlo, ma a volte è il modo migliore. E sì, in questo caso la risposta è una sceneggiatura. Prendiamoci un secondo ed esaminiamo i dati e quello che ho fatto. I dati forniti da Jim (disponibili Qui ) Somiglia a questo:
Jim's original data tableJim's original data tableJim's original data tableJim's original data tableLa tabella dati originale di Jim
Quello che vediamo sono le colonne per il nome del pastello e le coordinate HSV RGB per quel colore. In realtà non ho usato le coordinate HSV per la mia soluzione. Jim vorrebbe trovare un modo per assegnare a livello di codice un colore allo stato della riga che corrisponde al colore descritto dalle coordinate RGB . (Se sembra complicato, aspetta - non è poi così male.) Ecco la tabella dei dati che ho inviato indietro:
My data tableMy data tableMy data tableMy data tableLa mia tabella dei dati
Nota gli script di tabella che ho incluso (accanto alle frecce verdi a sinistra). Il primo è dove avviene la magia. Le altre sono alcune analisi divertenti di cui parlerò più avanti.
Bene, solleticami rosa!
Per prima cosa, diamo un'occhiata a questa faccenda della colorazione. A seconda di cosa stai cercando di fare, JMP richiede che le coordinate RGB siano formattate in modo diverso. Lavorare con i colori delle celle (gli sfondi dei nomi dei colori nelle colonne) e i colori dello stato delle righe richiede che RGB sia ridimensionato tra 0 e 1. Quindi, poiché stavo cercando di essere trasparente con quello che stavo facendo, ho creato un set di colonne (rosso, verde, blu) per ridimensionare le coordinate RGB dalla scala di colori a 8 bit (0-255) tra 0 e 1 . Il Table Script, "Color Cells", quindi fa due cose. Innanzitutto, passa attraverso ogni riga utilizzando a Per ogni riga() loop e :Color Nome << Colore Celle() messaggio per impostare i colori delle celle. Poi, sempre per trasparenza (e probabilmente perché l'ho fatto nel giro di un paio di giorni – non ricordo quale, a dire il vero), ho usato un secondo passaggio che prevedeva un Per() loop per impostare gli stati delle righe utilizzando le colonne che ho creato.
Names Default To Here( 1 );
dt = Current Data Table();
dt << Clear Select;
For Each Row(
// get RGB values
red = Column( "Red" )[Row()];
green = Column( "Green" )[Row()];
blue = Column( "Blue" )[Row()];
// color the "sample" column cell with the sample color
:Color Name << Color Cells( RGB Color( red, green, blue ), Row() );
);
For( i = 1, i <= N Rows(), i++,
// get RGB values
red = Column( "Red" )[i];
green = Column( "Green" )[i];
blue = Column( "Blue" )[i];
dt << Select Rows( i );
dt << Colors( RGB Color( red, green, blue ) );
dt << Clear Select;
);
L'esecuzione di questo script crea la tabella colorata che ho inviato a Jim.
Ora, sebbene questa tabella sia piuttosto colorata, il consumo di questo tipo di dati richiede davvero alcune potenti visualizzazioni. Poiché RGB è uno spazio di coordinate ternario, un grafico ternario sembra un punto di partenza appropriato:
A Ternary Plot is a good place to start.A Ternary Plot is a good place to start.A Ternary Plot is a good place to start.A Ternary Plot is a good place to start.Un complotto ternario è un buon punto di partenza.
La colorazione dello stato della riga fornisce un'immagine chiara di dove si trova ogni pastello nello spazio colore RGB. Vorrei anche sottolineare che c'è un po 'di a caveat emptor sull'uso dei grafici ternari per questa applicazione. A rigor di termini, la piattaforma Ternary Plot si aspetta che i tre valori forniti per ogni coordinata siano sommati a 1. Quando i dati forniti non soddisfano questo criterio, normalizza i punti dati in modo che lo facciano. Quindi, sebbene il Ternary Plot sia davvero accurato, non è una rappresentazione accurata al 100% dello spazio colore. Tuttavia, poiché lo scopo dell'esercizio era quello di produrre alcuni elementi grafici che suscitassero l'interesse di STEAM, penso che scambiare un po' di accuratezza con l'impatto visivo sia OK...
Analiticamente, è possibile raggruppare i pastelli in base alla somiglianza dei loro colori utilizzando un Clustering gerarchico. Qui, ho mostrato il Trama della costellazione , che è il mio modo preferito di guardare un dendrogramma, dall'esecuzione di Hierarchical Clustering sulle coordinate spaziali RGB:
A Constellation Plot produced by performing Hierarchical Clustering on the data.A Constellation Plot produced by performing Hierarchical Clustering on the data.A Constellation Plot produced by performing Hierarchical Clustering on the data.A Constellation Plot produced by performing Hierarchical Clustering on the data.Un grafico di costellazione prodotto eseguendo il clustering gerarchico sui dati.
Da questo, posso vedere che ci sono da qualche parte tra 5 e 7 gruppi di colori. Ho impostato il numero di cluster su 5 e poi ho guardato i grafici paralleli. Le differenze nei cluster sono facilmente visibili, così come le somiglianze all'interno dei cluster. Ho trovato interessante il fatto che i colori pastello e luminosi diurni fossero inseriti nei propri cluster (cluster 2 e 3).
The pastel and day-glow colors were put into their own clusters (clusters 2 and 3).The pastel and day-glow colors were put into their own clusters (clusters 2 and 3).The pastel and day-glow colors were put into their own clusters (clusters 2 and 3).The pastel and day-glow colors were put into their own clusters (clusters 2 and 3).I colori pastello e luminosi diurni sono stati inseriti nei propri cluster (cluster 2 e 3).
Puoi vedere risultati simili con lo script di clustering k-Means.
Post scriptum
Come sempre, rivisitare qualcosa dopo averlo accantonato per un po' fornisce una nuova prospettiva. Ho rivisitato questo set di dati un paio di volte da quando Jim ha contattato originariamente. Cosa posso dire? Sono un nerd, ed è un piccolo set di dati divertente con cui giocare. Innanzitutto, durante la stesura di questo post, mi sono reso conto di aver reso questo codice molto più complesso del necessario. L'intera operazione di colorazione potrebbe essere eseguita utilizzando un singolo Per ogni riga() ciclo continuo. Posso anche semplificare la codifica creando un elenco e trasformando l'elenco per ottenere il set di coordinate di cui JMP ha bisogno senza creare nuove colonne.
Names Default To Here( 1 );
dt = Current Data Table();
dt << Clear Select;
For Each Row(
// get RGB values
r = Column( "R" )[Row()];
g = Column( "G" )[Row()];
b = Column( "B" )[Row()];
rowVal = {r, g, b};
// create a scaled set of colors
rowValS = rowVal/255;
// color the "sample" column cell with the sample color
:Color Name << Color Cells( RGB Color( rowValS ), Row() );
// apply a row state to each row
dt << Select Rows( Row() );
dt << Colors( RGB Color( rowValS ) );
dt << Clear Select;
);
Successivamente, mi è piaciuto molto il Ternary Plot dal set di dati originale di Jim (problemi di precisione a parte). Mi ha fatto pensare a cosa sarebbe successo se avessi generato un esempio di riempimento dello spazio che mappasse tutte le combinazioni nello spazio RGB. La sceneggiatura che ho ideato è abbastanza complessa. L'ho caricato su File Exchange come Mappatura dello spazio colore RGB se vuoi dare un'occhiata. Indipendentemente da ciò ... la trama ternaria che produce è piuttosto impressionante. Col senno di poi, forse avrei dovuto intitolare questo post "Dark Side of the Moon".
This is what happened when I generated a space-filling example that mapped out all the combinations in the RGB space.This is what happened when I generated a space-filling example that mapped out all the combinations in the RGB space.This is what happened when I generated a space-filling example that mapped out all the combinations in the RGB space.This is what happened when I generated a space-filling example that mapped out all the combinations in the RGB space.Questo è quello che è successo quando ho generato un esempio di riempimento dello spazio che ha mappato tutte le combinazioni nello spazio RGB. Nota dell'editore: Hai letto il prima puntata della nostra serie Engineering Mailbag ? Guarda come Mike aiuta un utente che stava usando JMP per decidere se sottoscrivere un servizio di sgombero neve.
Una nota dell'autore
Per quelli di voi che stanno leggendo di nuovo questo, no non siete pazzi, il titolo è cambiato un po'.Ho ricevuto una richiesta di aggiornamento del titolo in modo che sia più facile da trovare per i nostri motori di ricerca.Posso solo supporre che ciò sia dovuto al fatto che alcuni motori di ricerca sono incarnazioni moderne di bibliotecari di riferimento del XIX secolo privi di senso dell'umorismo.Ci scusiamo per gli eventuali disagi.-M