Cos’è la Coxcomb Chart
La Coxcomb Chart, conosciuta anche come diagramma a rosa (rose diagram) o diagramma ad area polare (polar area diagram) è probabilmente una delle visualizzazioni più influenti di tutti i tempi: fu resa famosi da Florence Nightingale (statistica e pioniera della moderna assistenza infermieristica) che la uso per convincere la regina Vittoria a migliorare l’igiene negli ospedali militari, salvando così la vita di molte migliaia di soldati soldati britannici che morivano ogni mese durante la guerra di Crimea.
Il layout della Coxcomb Chart è simile a quello di grafico a torta modificato dove ogni sezione/fetta rappresenta una categoria o intervallo (nel caso del grafico di Nightingale, un mese specifico dell’anno).
A differenza delle pie chart, nel grafico Coxcomb ogni fetta/sezione presenta lo stesso angolo, mentre il raggio della fetta è associato alla quantità che viene visualizzata. In questo modo le varie sezioni si estenderanno con raggi differenti (in modo silmile alle differenti altezze nella bar chart).
In un grafico a torta, le misure sono codificate usando gli angoli: i valori più grandi hanno angoli più grandi. Nella Coxcomb Chart, al contrario, tutte le sezioni hanno angoli uguali e la misura è codificata usando l’area della sezione/fetta.
E’ importante sottolineare che, in questo tipo di grafici, non saranno in scala con il raggio (scalatura lineare), ma in scala con l’area (scalatura non lineare): questo porterà ad avere raggi diversi.
Perchè è Utile? Quando Utilizzarla?
La Coxcomb Chart aiuta a rendere visibili i modelli stagionali e a ridimensionare le piccole differenze, restituendo una visualizzazione di facile lettura e molto versatile, che si adatta facilmente a vati tipi di dati, analisi e pubblico di destinazione.
Ogni sezione di una Coxcomb contiene sotto-sezioni codificate con colori diversi, ciascuna con le proprie aree.
A differenza di una stacked bar chart, le sotto-sezioni non sono impilate, ma si sovrappongono l’una all’altra, tutte a partire da un punto centrale condiviso. A causa della natura sovrapposta di In questo modo, ogni sottosezione, le sottosezioni più piccole appariranno sovrapposte altre sotto-sezioni in modo che siano sempre visibili.
Diversi tipi di Visualizzazione
Ci sono diverse variazioni della Coxcomb Chart classica, che differiscono tra loro in base a 3 parametri principali:
- Scaling – Area o Raggio
- Stacking Option – Standard (nessun impilamento) o Impilato
- Whitespace – Specifica una percentuale di ogni slice che sarà consumata dagli spazi bianchi. Questo ti permette di creare una certa spaziatura tra le sezioni.
Andando a modificare questi 3 parametri, è possibile ottenere quattro diversi grafici:
A) Standard, Scaled by Area: una Coxcomb Chart standard, ridimensionata per Area.
B) Standard, Scaled by Radius: grafico Standard, questa volta ridimensionato per Raggio.
C) Stacked, Scaled by Area: Coxcomb Chart Impilata e scalata in base all’Area
D) Stacked, Scaled by Radius – Sostanzialmente un istogramma radiale con barre impilate (radial stacked histogram bar chart)
Creazione e Visualizzazione della Coxcomb Chart e delle sue varianti su Tableau
- Dataset
In seguito verrà illustrato, passo per passo, un metodo per creare e visualizzare questi tipi di grafici , utilizzando Tableau
Desktop.
Per semplificare il processo dimostrativo, verrà utilizzato un dataset piuttosto semplice, costituito da tre colonne, il numero minimo richiesto per la costruzione del template su Tableau. Le colonne sono le seguenti:
[Section] – Dimensione che definisce le sezioni, che nel dataset utilizzato corrispondono agli anni (dal 2010 al 2021) in cui sono stati raccolti i dati.
[Sub-Section] – Dimensione che definisce le sotto-sezioni (Home Office, Consumer e Corporate) all’interno di ogni sezione, e che verrà usata per dare la colorazione alle diverse sezioni.
[Measure] – Misura che deve essere tracciata dal grafico.
È importante che la tabella che useremo come template includa tutte le combinazioni che verranno mostrate nel grafico. Perciò, nel caso che in una sottosezione siano assenti dei dati, bisogna assicurarsi che siano sostituiti con uno zero come misura.
Una volta che abbiamo scelto il dataset adatto per una rappresentazione a Coxcomb Chart, dobbiamo procedere con una veloce preparazione preliminare dei dati, utilizzando Microsoft Excel.
- Preparazione dei Dati
In questo step, andremo a creare un foglio Excel che conterrà i dati necessari per la densificazione dei dati (passaggio necessario per disegnare/tracciare le diverse sezioni della Coxcomb Chart su Tableau). Questo file .xlsx verrà poi utilizzato per creare una relationship su Tableau Desktop.
A seconda della preferenza dell’utente è possibile crearlo come sheet aggiuntivo del Dataset originale (nel caso si utilizzi Excel) o collegarlo in seguito direttamente su Tableau.
Molto semplicemente, il file dovrà contenere una colonna (Point), che contenga tutti i valori numerici compresi da 0 a 200.
A questo punto salviamo la tabella con i dati per la data densification, in un file rinominato Model.xlsx
Il prossimo step consiste nel raggruppare e il dataset principale(Data) insieme alla nuova tabella Model, tramite i seguenti passaggi:
- Apri Tableau Desktop/Online, ed importa il dataset orignale (Data). Trascina lo sheet principale al centro del foglio di lavoro.
- Nella sezione Connection, in alto a sinistra, premi Add, e nella nuova finestra, nella sezione To a File, seleziona Microsoft Excel. Naviga fino alla cartella di interesse, e seleziona Model.
- Trascina Model nel foglio di lavoro, accanto a Data, in modo da impostare una relationship. Clicca sulla connessione in arancio per aprire il menù sottostante, modifica la relazione utilizzando l’opzione Edit Calculation in entrambi i campi, in modo da avere una relazione 1 = 1, come mostrato in figura.
Seguendo questa procedura, il foglio di lavoro dovrebbe aggiornarsi automaticamente e restituirci i nostri dati in modo corretto. Eventuali modifiche possono essere apportare direttamente su Tableau.
3. Creazione dei 3 Parametri di Visualizzazione
Terminata la preparazione dei dati, possiamo cominciare ad impostare la creazione della Coxcomb Chart, utilizzando unicamente Tableau. Iniziamo con la creazione dei parametri necessari ad impostare le diverse tipologie di grafici.
Come illustrato in precedenza, questi parametri sono Stacking Option, Scaling e Whitespace.
Per prima cosa creiamo un parametro Option, relativo alle diverse Stacking Option (Standard e Stacked).
Tramite il menù a tendina, in alto a destra nel Data Panel, selezioniamo Create Parameter. Una volta aperta la finestra, facciamo in modo di impostare il parametro come mostrato nella figura sottostante:
Analogamente a quanto appena fatto, creiamo un parametro Scaling contenente una lista (Area, Radius), utilizzando i seguenti valori:
Ed infine un parametro Whitespace, con i valori (in %) posti in un Range che va da -1 a 1.
- Template per la Data Densification
A questo punto procediamo con la Data Densification vera e propria. Saranno necessari molte Table Calculation, perciò e consigliabile numerarle in ordine sequenziale, in modo da non perdere il filo logico e per avere un workflow più ordinato.
Sempre tramite il menu nel Data Panel, tramite Create Calculated Field, andremo ad impostare i sequenti campi, seguendo l’ordine indicato. E’ altamente cosnigliato di mantenere i commenti all’interno dei calcoli, in modo da avere anche in futuro, un metodo veloce per cambiare/aggiustare il metodo.
00. Measure for Chart. Imposta la misura aggregata da utilizzare per la Coxcomb Chart.
SUM([Measure])
01. Section Count – Calcola il numero di Sezioni (Section) del grafico.
WINDOW_COUNT(COUNT([Section]))
02. Section Spacing – Determina la Spaziatura dell’Angolo tra le Sezioni.
// 360 degrees divided by the number of sections.
360/[01. Section Count]
03. Overall Section Size – Determina la Dimensione complessiva di ogni Sezione. Avendo aggiunto 201 punti di debsificazione, dobbiamo dividere per 201.
WINDOW_SUM([00. Measure for Chart]/201)
04. Max Section Size – Ottiene la Dimensione massima della Sezione complessiva.
// Max size of any section (disregarding sub-section).
// We’ll use this to create a sizing between 0 and 1.
// This will allow fixing of the axes, which will enhance ease-of-use.
IF [Option]=”Stacked” THEN
// Get the max of the total segment sizes.
WINDOW_MAX([03. Overall Section Size])
ELSE
// Each section starts at zero so get the max segment period.
// We’ve added 201 densification points so we need to divide by 201.
WINDOW_MAX([00. Measure for Chart]/201)
END
05. Part Size – Ottiene la Dimensione di ogni Sub-Section.
// Size of this part of the chart (section + sub-section).
// We’ve duplicated our data 201 times, so we have to divide by 201.
// Also adjust to make sure the value goes from 0 to 1.
// Note: Since whitespace is taking the same percentage off each part…
// …no adjustment is necessary to account for it.
[00. Measure for Chart]/[04. Max Section Size]/201
06. Section Index – Crea an Index per le Sections.
// We want the first section to be 0, the next to be 1.
// So we’ll compute an index along the section.
INDEX()-1
07. Point Index – Crea un Index per il tracciamento/disegno dei punti.
// Index for each of the densification points. We’ll use this in table calcs.
INDEX()-1
08. Point Step – Determina la spaziatura dell’Angolo per ogni punto
// Degree change for each point of the arc.
// Densification Points go from 0 to 200.
// Each section will have two arcs–one inner and one outer.
// Point 0 will be the start of one inner arc. Point 1 will be the start of the outer. These will connect together.
// Then the outer arc will run from points 1 to 100. 100 will connect to point 101, which is the end of the inner arc.
// This will then run to point 200, which is in the same location as point 0.
// Thus there are 99 points from one end of an arc to the next.
// Point step will be the degrees each moves toward the other end of the arc.
// The last step of this is to reduce to account for the whitespace.
[02. Section Spacing]/99*(1-[Whitespace])
09. Slice Area – Calcola la Slice Area
// Area of the entire slice (from centre to end).
IF [Option]=”Stacked” THEN
// Running sum of all previous sub-sections
RUNNING_SUM([05. Part Size])
ELSE
// Each section starts at zero so get the max segment period.
// Thus, we just want the slice itself.
[05. Part Size]
END
10. Outer Radius – Calcola il Raggio esterno.
// This is the outer radius of the section/part we’re drawing when sized by area.
// Area of circle = πr2 so area of a slice = πr2/slices…
// So Radius = √(area*slices/π)
SQRT([09. Slice Area]*[01. Section Count]/PI())
11. Inner Radius – Calcola il Raggio interno.
// This is the inner radius of the section/part we’re drawing when sized by area.
// Area of circle = πr2 so area of a slice = πr2/slices…
// So Radius = √(area*slices/π)
SQRT(([09. Slice Area]-[05. Part Size])*[01. Section Count]/PI())
12. Max Radius – Calcola il Raggio massimo.
// Maximum radius for the stacked/area scaled option.
WINDOW_MAX([10. Outer Radius])
13. Radius – Calcola il Raggio per ogni punto.
// This is the radius of the section/part we’re drawing.
// We’ll use trig to plot the points.
IF [Option]=”Stacked” and [Scaling]=”Radius” THEN
// Scale by radius, starting at end of previous section.
IF [07. Point Index] = 0 OR [07. Point Index] >=101 THEN
// Inner arc.
RUNNING_SUM([05. Part Size])-[05. Part Size]
ELSE
// Outer arc.
RUNNING_SUM([05. Part Size])
END
ELSEIF [Option]=”Stacked” and [Scaling]=”Area” THEN
// Scale by area starting at end of previous section.
// Adjust each by the max radius to force range to 0 to 1.
IF [07. Point Index] = 0 OR [07. Point Index] >=101 THEN
// Inner arc.
[11. Inner Radius]/[12. Max Radius]
ELSE
// Outer arc.
[10. Outer Radius]/[12. Max Radius]
END
ELSEIF [Option]=”Standard” and [Scaling]=”Radius” THEN
// Scale by radius, starting from centre.
IF [07. Point Index] = 0 OR [07. Point Index] >=101 THEN
// Inner arc.
0
ELSE
// Outer arc.
[05. Part Size]
END
ELSEIF [Option]=”Standard” and [Scaling]=”Area” THEN
// Scale by area, starting from centre.
// Adjust each by the max radius to force range to 0 to 1.
IF [07. Point Index] = 0 OR [07. Point Index] >=101 THEN
// Inner arc.
0
ELSE
// Outer arc.
[10. Outer Radius]/[12. Max Radius]
END
END
14. Angle Whitespace – Calcola lo spazio bianco dell’angolo.
// Amount of white space on each side.
// Take the percent of 360 degrees (e.g. 360 x 10% = 36). This is the total whitespace.
// Divide that by the sections (e.g. 36/6=6). This is the white space for each section.
// Divide that by 2 (e.g. 6/2 = 3). This is the white space on each side of the section.
((360*[Whitespace])/[01. Section Count])/2
15. Angle in Degrees – Calcola l’angolo per ogni punto.
// Angle for each point along the arc.
// Densification Points go from 0 to 200.
// Each section will have two arcs–one inner and one outer.
// Point 0 will be the start of one inner arc. Point 1 will be the start of the outer. These will connect together.
// Then the outer arc will run from points 1 to 100. 100 will connect to point 101, which is the end of the inner arc.
// This will then run to point 200, which is in the same location as point 0.
// We want this to start at 12:00 and run counter-clockwise.
// Each point also needs to be adjusted forward or backward based on the whitespace requirements.
IF [07. Point Index]=0 OR [07. Point Index]=1 OR [07. Point Index]=200 THEN
// End points on left side.
-[06. Section Index]*[02. Section Spacing] + 90 – [14. Angle Whitespace]
ELSEIF [07. Point Index]=100 OR [07. Point Index]=101 THEN
// End points on the other side.
-[06. Section Index]*[02. Section Spacing] – [02. Section Spacing] + 90 + [14. Angle Whitespace]
ELSEIF [07. Point Index]<100 THEN
// Top arc, moving slowly by the point step
-[06. Section Index]*[02. Section Spacing] + 90 – [14. Angle Whitespace] – ([07. Point Index]-1)*[08. Point Step]
ELSE
// Bottom arc, moving slowly by the point step (in the other direction)
-[06. Section Index]*[02. Section Spacing] – [02. Section Spacing] + 90 + [14. Angle Whitespace] + ([07. Point Index]-101)*[08. Point Step]
END
16. Angle in Radians – Converte l’angolo in radianti.
// Convert degrees to radians
RADIANS([15. Angle in Degrees])
17. X
// X coordinate which we’re calculating using trig.
COS([16. Angle in Radians]) * [13. Radius]
18. Y
// Y coordinate which we’re calculating using trig.
SIN([16. Angle in Radians]) * [13. Radius]
- Ulteriori Calculated Field, ed Extra
19. Key
// Key field indentifying each unique sub-section.
[Section] + “|” + [Sub-Section]
20. Fake Highlight
// Used to prevent highlighting after selection.
// See https://sonsofhierarchies.com/default-highlighting/
“”
Assemblare la Coxcomb Chart
Una volta creati tutti i parametri e i Campi Calcolati, possiamo finalmente assemblare la nostra Coxcomb Chart.
Cominciamo impostando le seguenti misure in questo modo:
- Columns: [17. X]
- Rows: [18. Y]
Nel menù a tendina sotto Marks, modifica la tipologia da Automatic a Polygon.
A questo punto inseriamo, in quest’ordine e gerarchia, i seguenti campi nei Marks:
- [19. Key] in Details.
- [Sub-Section] in Color.
- [Section] in Detail.
- [20. Fake Highlight] in Detail.
- [Point] in Path.
Come utima cosa dobbiamo editare la Table Calculation per entrambi i nostri campi calcolati ([17. X] e [18. Y]), direttamente dal menù che appare con il tasto destro, come mostrato in figura.
Per ultimare la costruzione della Coxcomb Chart, dovremo utilizzare delle Nested Calculations. In questo tipo di calcoli è molto importante l’ordine dei fattori e i parametri con cui questi calcoli vengono effettuati, perciò bisogna impostare, per entrambi X e Y, il setting di valori che verrà mostrato in seguito:
- Nested Calculations : 07. Point Index
- Compute using : Specific Dimension:
- Point
- Key
- Nested Calculations : 06. Section Index
- Compute using : Specific Dimension:
- Section
- Key
- Nested Calculations : 01. Section Count
- Compute using : Specific Dimension:
- Section
- Key
- Nested Calculations : 13. Radius
- Compute using : Specific Dimension:
- Section
- Sub-Section
- Key
- Restarting every: Section
- Nested Calculations : 04. Max Section Size
- Compute using : Specific Dimension:
- Section
- Sub-Section
- Key
- Nested Calculations : 03. Overall Section Size
- Compute using : Specific Dimension:
- Section
- Sub-Section
- Key
- Restarting every: Section
- Nested Calculations : 09. Slice Area
- Compute using : Specific Dimension:
- Section
- Sub-Section
- Key
- Restarting every: Section
- Nested Calculations : 12. Max Radius
- Compute using : Specific Dimension:
- Section
- Sub-Section
- Key
- Point
Se abbiamo eseguito tutti gli step in modo corretto, dovemmo vedere la Coxcomb Chart che pian piano prende forma.
A questo punto, tramite il tasto Show Parameter, possiamo mostrate i parametri che determinano le varie versioni della Coxcomb, e scegliere le opzioni e i valori che si sposano meglio con la nostra analisi.
Aggiungendo alcuni dettagli nelle Tooltip, e pulendo lo sfondo dalle griglie e dagli assi, il risultato finale dovrebbe sembrare molto simile a questo:
Abbiamo quindi costruito una Coxcomb Chart, utilizzando (quasi interamente) Tableau. Spero che questo tutorial sia stato sufficientemente chiaro ed esaustivo, che e possa aver aiutato nuove persone a scoprire, a costruire, e ad apprezzare questo tipo di visualizzazione dei dati, estremamente versatile.
Bibliografia
Tableau Coxcomb Chart Template: https://www.flerlagetwins.com/2021/12/coxcomb.html
4 Tips for Writing Complicated Tableau Calculations: https://www.flerlagetwins.com/2021/09/complicated-calcs.html
Creating Coxcomb Charts in Tableau: https://boraberan.wordpress.com/2014/03/30/creating-coxcomb-charts-in-tableau/
Coxcomb charts in Alteryx and Tableau: your one-stop blog shop: https://www.thedataschool.co.uk/gwilym-lockwood/coxcomb-charts-alteryx-tableau-one-stop-blog-shop
AIEngineering – Coxcomb Chart Using Tableau – Nightingale Rose Diagram: https://www.youtube.com/watch?v=qwTEZlaTedM
Toan Hoang, Tableau Visionary – Tableau with Music / Coxcomb Chart: https://www.youtube.com/watch?v=Ubhb0CIdcSM