---
title: "Visualizzazione"
author: "Stefano Bussolon"
date: "marzo 2019"
nooutput:
  pdf_document: default
  html_document: default
output:
  xaringan::moon_reader:
    lib_dir: libs
    nature:
      highlightStyle: github
      highlightLines: true
      countIncrementalSlides: false

---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

# La visualizzazione dei dati

---


## I grafici

I grafici costituiscono una forma di rappresentazione visiva, su di un'area bidimensionale, di un insieme di informazioni.

Le dimensioni spaziali e visive vengono utilizzate per rappresentare dati quantitativi, ordinali o categoriali.

---


## Vantaggi

Uno dei vantaggi della rappresentazione grafica è che sfrutta alcune caratteristiche del sistema visivo:

* la capacità di elaborare preattentivamente, in parallelo, un'ampia quantità di dati;
* la capacità di identificare pattern, distribuzioni, relazioni fra i dati;
* la capacità di percepire l'allineamento, orizzontale e verticale, degli elementi grafici;
* la capacità di stimare, anche se approssimativamente, differenze di lunghezza, di luminosità, di colore e di forma degli elementi

---

## Un buon grafico

* riesce a comunicare una appropriata quantità di **informazioni** in maniera **corretta**, non distorta e **facile** da comprendere;  
* permette di far emergere **pattern**, **distribuzioni** di variabili, **relazioni** fra variabili, presenza di outlier, relazioni fra osservazioni o fra statistiche, e di stimare, seppure approssimativamente, il valore delle singole osservazioni.
* è intuitivo, massimizza il rapporto fra informazione e *rumore*, senza indurre un sovraccarico cognitivo; 
* gli aspetti estetici contribuiscono a rappresentare l'informazione

---

## Gli elementi grafici

Un grafico è un oggetto grafico complesso. Gli oggetti grafici complessi sono composti da

* uno **spazio** grafico (bidimensionale)
* degli **oggetti** grafici (complessi o semplici)
* delle strutture di riferimento (titoli, legende, assi, etichette, annotazioni), che permettono l'interpretazione e facilitano la lettura dei dati

La definizione è ricorsiva: un oggetto grafico complesso può contenere altri oggetti grafici complessi.

---

## Gli oggetti grafici

Gli oggetti grafici rappresentano:

* osservazioni
* statistiche
* relazioni (fra osservazioni o fra statistiche)

Gli oggetti grafici semplici sono formati da figure geometriche - punti (0d), linee o curve (1d), rettangoli o aree (2d) - da icone o da elementi testuali

---

## Rappresentare le relazioni

Le relazioni (fra osservazioni o statistiche) sono rappresentate attraverso differenti modalità:

* clustering spaziale
* inclusione in un contenitore (categoriale)
* utilizzo di separatori (categoriale)
* allineamento (relazione ordinale)
* collegamento: generalmente le osservazioni sono punti (nodi), i collegamenti linee o curve (archi); possono essere rappresentati varie tipologie di grafi: catene, loop, grafi complessi, alberi

---

## Codifica delle variabili

Gli oggetti grafici codificano l'informazione in base ad alcune dimensioni. Le principali sono

* la posizione sugli assi x ed y
* la forma
* il colore
* la luminosità
* la dimensione

Altre possibili dimensioni sono il tipo e lo spessore dei bordi o delle linee, il pattern in caso di aree.

---

## Dimensioni e tipologia di dati

Le coordinate x e y sono adatte a rappresentare variabili continue, ordinali e categoriali.

La forma (dei punti), il tipo di linea, alcuni pattern di riempimento delle aree, e alcune palette di colore sono adatti a rappresentare un numero limitato di categorie.  

Alcune palette di colore, la luminosità degli oggetti e la densità dei pattern sono adatti a rappresentare le variabili ordinali;  
sono meno adatti a rappresentare le variabili ad intervalli, in quanto la capacità del nostro sistema visivo di stimare gli intervalli è meno precisa.  

---

## Percezione e stima dei valori

Il sistema visivo riesce a stimare abbastanza bene la dimensione degli oggetti (rappresentazione grafica dei punti, la lunghezza delle linee, la dimensione delle aree) se si sviluppa in una sola dimensione, mentre ha difficoltà a stimare la dimensione in base all'area.

Anche la stima angolare è più approssimativa (e dunque è più difficile stimare le proporzioni nei grafici con assi radiali: grafici a torta o a ciambella)

---

## Rappresentazione *multivariata*

È potenzialmente possibile rappresentare, in un grafico, fino a 5 variabili di ogni osservazione, attraverso le coordinate x e y (a intervalli, ordinali o categoriali), la forma (categorie), il colore (ordinale o categoriale) e la dimensione (ordinale o a rapporti).

In pratica, però, si rischia l'overload cognitivo.  
È pertanto opportuno limitarsi a rappresentare fino a 3, al massimo 4 variabili.

---

# ggplot2

---

class: vCentrale

### &nbsp;

ggplot2 è un pacchetto per creare grafici in R. ggplot2 è molto popolare, in quanto

* crea grafici esteticamente piacevoli
* è molto potente
* utilizza in maniera esplicita l'approccio di *Grammar of Graphics*

---

## La logica

Con ggplot2 la creazione di un grafico avviene attraverso una serie di passi, che possono essere concatenati:

* **creare l'oggetto** ggplot ed associare il set di dati (generalmente un data.frame) da rappresentare
* calcolare le eventuali **statistiche**
* identificare la variabile (analisi univariata) o le variabili (rappresentazione bi- o multivariata) da **mappare** sugli assi x e y o sulle dimensioni grafiche del colore, della dimensione, della forma
* decidere la **geometria**, ovvero il tipo di elementi visuali (punti, linee, aree o oggetti complessi) in base alla tipologia di dati e delle eventuali statistiche da rappresentare
* definire le **scale** e le eventuali trasformazioni
* creare uno o più **livelli** grafici (layer) dove collocare 
	* gli elementi grafici (semplici e complessi)
	* le strutture di supporto alla lettura ed interpretazione (titoli, assi, scale, griglie)  
  La sovraimposizione di livelli diversi permette di rappresentare, sullo stesso spazio, osservazioni, statistiche e strutture di supporto

---

## La sintassi

La creazione di un grafico ggplot2 utilizza una sintassi che può essere sintetizzata nel seguente template (cita fonte)

```{r eval=FALSE}

grafico <- ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>(
     mapping = aes(<MAPPINGS>),
     stat = <STAT>, 
     position = <POSITION>
  ) +
  <COORDINATE_FUNCTION> +
  <FACET_FUNCTION>

print (grafico)
	
```
---

## Risorse

* [Fundamentals of Data Visualization](https://serialmentor.com/dataviz/aesthetic-mapping.html)
* [The Grammar of Graphics](https://www.cs.uic.edu/~wilkinson/TheGrammarOfGraphics/GOG.html)
* [A Comprehensive Guide to the Grammar of Graphics for Effective Visualization of Multi-dimensional…](https://towardsdatascience.com/a-comprehensive-guide-to-the-grammar-of-graphics-for-effective-visualization-of-multi-dimensional-1f92b4ed4149)
* [The Art of Effective Visualization of Multi-dimensional Data](https://towardsdatascience.com/the-art-of-effective-visualization-of-multi-dimensional-data-6c7202990c57)
* [Grammar of Graphics in R](https://houstonusers.github.io/intro-to-ggplot2/#/jacques-bertin-1967)
* [3 Data visualisation | R for Data Science](https://r4ds.had.co.nz/data-visualisation.html)
* [Quick-R: ggplot2 Graphs](https://www.statmethods.net/advgraphs/ggplot2.html)
* [Data visualization with ggplot2](https://datacarpentry.org/R-ecology-lesson/04-visualization-ggplot2.html)
* [Before Tufte, there was Bertin – Karl Sluis – Medium](https://medium.com/@karlsluis/before-tufte-there-was-bertin-63af71ceaa62)
* [Beyond Tufte – Karl Sluis – Medium](https://medium.com/@karlsluis/beyond-tufte-fd93cbcec6af)
* [Top 50 ggplot2 Visualizations - The Master List (With Full R Code)](http://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html)

---

# Esempi

---

Per mostrare ggplot2 in azione, carichiamo il dataframe `parole_nonparole_pulito.rds` e carichiamo la libreria `ggplot2` (eventualmente la installiamo se non presente nel nostro sistema).


```{r vis_library_ggplot2}
# install.packages("ggplot2")
library(ggplot2)
# partecipanti <- readRDS("https://s3.eu-central-1.amazonaws.com/bussolon/dati/parole_nonparole_pulito.rds")
partecipanti <- readRDS("~/documenti/didattica/r_dottorato/dati/parole_nonparole_pulito.rds")

```

---

## Barplot

Creaiamo un grafico a barre con la distribuzione della scolarità. Mappiamo anche la dimensione del genere.

```{r vis_barchart, fig.cap="Grafico a barre"}

ggBar1 <- ggplot(partecipanti, aes(scol))
ggBar1 + geom_bar(aes(fill=sex), width = 0.5) + 
  theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
  labs(title="Scolarità", 
       subtitle="Scolarità, per sesso", 
       caption="Parole non parole - barplot",
  		 x="", y="")

```

---

```{r plot_vis_barchart}
print (ggBar1)
```

---

Un secondo esempio di barplot per visualizzare la distribuzione del sesso.

```{r vis_barchart2, fig.cap="Secondo barplot"}

ggBar2 <- ggplot(partecipanti, aes(x="", fill=sex)) +
	geom_bar(width = 0.5) + 
	#theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
	labs(title="Genere", 
       #subtitle="Genere", 
			 x= "",
			 y= "Frequenza",
       caption="Parole non parole - barplot 2")

```

---

```{r plot_vis_barchart2}
plot(ggBar2)
```



---

## Grafico a torta

In ggplot2 un grafico a torta è un grafico a barre con coordinate polari.

```{r vis_pie, fig.cap="Grafico a torta"}

ggPie <- ggBar2 +
	coord_polar("y", start=0)

```

---

```{r plot_vis_pie}
plot(ggPie)
```


---

## Istogramma

L'istogramma della distribuzione delle risposte corrette

```{r vis_ggHist, fig.cap="Istogramma"}

ggHist <- ggplot(data=partecipanti, aes(corrette)) + 
	geom_histogram() +
  labs(title="Corrette",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - barplot")

```
---
```{r plot_vis_hist, warning=FALSE}
plot(ggHist)
```

[Histograms and frequency polygons — geom_freqpoly • ggplot2](https://ggplot2.tidyverse.org/reference/geom_histogram.html)

## Density plot

```{r vis_density, fig.cap="Density graph"}

ggDensity <- ggplot(data=partecipanti, aes(corrette)) + 
	geom_density() +
  labs(title="Corrette",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - Density")

```

---

```{r plot_vis_density}
plot(ggDensity)
```

---

Creiamo un nuovo density plot. In questo caso, però, definiamo il colore dell'area (fill) in base alla scolarità. In questo modo otterremo 6 aree sovrapposte.

Va notato che l'altezza delle aree è normalizzata, e non proporzionale alla frequenza delle varie categorie.

```{r vis_density2, fig.cap="Density graph - per scolarità"}

ggDensity2 <- ggplot(data=partecipanti, aes(corrette)) + 
	geom_density(aes(fill=factor(scol)), alpha=0.5) +
  labs(title="Corrette",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - Density")


```

---

```{r plot_vis_density2}
plot(ggDensity2)
```


---

## Boxplot

Il boxplot della distribuzione delle risposte corrette, distinte per scolarità

```{r vis_boxplot, fig.cap="Boxplot corrette x scolarità"}

ggBoxplot <- ggplot(data=partecipanti, aes(scol,corrette)) + 
	geom_boxplot(varwidth=T) + # , fill="plum"
  labs(title="Corrette x scolarità",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - Boxplot")

```

---
```{r plot_vis_boxplot}
plot(ggBoxplot)
```

---

## Boxplot + jitter

In questo grafico al boxplot sono sovrapposti (in un layer superiore) i punti corrispondenti alle osservazioni.  
Viene usata la geometria `jitter`, che inserendo del *rumore* nei dati permette la visualizzazione dei punti altrimenti sovrapposti.

In questo grafico vediamo all'opera la logica dei layer sovrapposti.

```{r vis_boxplot2, fig.cap="Boxplot + Jitter"}

ggBoxplot2 <- ggplot(data=partecipanti, aes(scol,corrette)) + 
	geom_boxplot(varwidth=T) + # , fill="plum"
	geom_jitter(width = .2, size=1, color="lightslateblue") +
  labs(title="Corrette x scolarità",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - Boxplot")



```

---

```{r plot_vis_boxplot2}
plot(ggBoxplot2)
```


---

### Violin plot

![xkcd](https://imgs.xkcd.com/comics/violin_plots.png)

---

```{r vis_violin, fig.cap="Grafico a violino"}

ggViolin <- ggplot(data=partecipanti, aes(scol,corrette)) + 
	geom_violin() + # , fill="plum"
  labs(title="Corrette x scolarità",
  		 x="Risposte corrette",
  		 y="",
       subtitle="Numero di risposte corrette", 
       caption="Parole non parole - Boxplot")

```

---

```{r plot_vis_violin}
plot(ggViolin)
```

---

## Scatterplot

```{r vis_scatterplot, fig.cap="Scatterplot"}

ggScatter <- ggplot(partecipanti, aes(x=risposte, y=corrette)) + 
  geom_point(aes(col=sex, size=as.numeric(scol))) +  # , size=scol
  labs(
    title="Scatterplot", 
  	subtitle="Risposte Vs Corrette", 
    y="Corrette", 
    x="Risposte date", 
    caption = "Exp. parole non parole")
```

In questo grafico abbiamo mappato 4 dimensioni, ma il rischio è di sovraccaricare il grafico. 

---
```{r plot_vis_scatterplot, warning=FALSE}
plot(ggScatter)
```

---


```{r vis_jitter, fig.cap="Jitter Plot"}
ggJitter <- ggplot(partecipanti, aes(x=risposte, y=corrette)) + 
  # geom_point(aes(col=sex, size=as.numeric(scol))) +  # , size=scol
	geom_jitter(aes(col=sex),width = .2, size=1) +
  labs(
    title="Jitterplot", 
  	subtitle="Risposte Vs Corrette", 
    y="Corrette", 
    x="Risposte date", 
    caption = "Exp. parole non parole")


```
---
```{r plot_vis_jitter, warning=FALSE}
plot(ggJitter)
```

---

# Esercizi

---

Caricare il data frame df_simulato

```{r vis_read_df_simulato}

df_simulato <- read.csv(
	"https://s3.eu-central-1.amazonaws.com/bussolon/dati/df_simulato.csv")

```

Riprodurre i seguenti grafici

---

```{r sim_barplot1, echo=FALSE}
sim_barplot1 <- ggplot(df_simulato, aes(ordinale)) +
  geom_bar(aes(fill=nominale), width = 0.5) + 
	theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
	labs(title="Barplot", 
			 subtitle="ordinale su nominale", 
			 caption="")

plot(sim_barplot1)

```

---

```{r sim_barplot2, echo=FALSE}
sim_barplot2 <- ggplot(df_simulato, aes(ordinale)) +
  geom_bar(aes(fill=nominale), width = 0.5, position="dodge") + 
	theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
	labs(title="Barplot", 
			 subtitle="ordinale su nominale", 
			 caption="")

plot(sim_barplot2)

```

---

```{r sim_pie, echo=FALSE}
sim_pie <- ggplot(df_simulato, aes(fill=nominale, x=3.5, xmax=4, xmin=3)) + # x=""
	geom_bar() + # width = 0.5
	#xlim(c(0,4)) +
	coord_polar("y", start=0) +
	#theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
	labs(title="Grafico a torta", 
			 #subtitle="Genere", 
			 x= "",
			 y= "",
			 caption="")
plot(sim_pie)
```

---

```{r sim_donut, echo=FALSE}
sim_donut <- ggplot(df_simulato, aes(fill=nominale, x=3, xmax=4, noxmin=2)) + # x=""
	geom_bar(width = 1.5) + # width = 0.5
	xlim(c(0,4)) +
	coord_polar("y", start=0) +
	#theme(axis.text.x = element_text(angle=65, vjust=0.6)) +
	labs(title="Grafico a ciambella", 
			 #subtitle="Genere", 
			 x= "",
			 y= "",
			 caption="")
plot(sim_donut)
```

---

```{r sim_hist, echo=FALSE}
sim_hist <- ggplot(data=df_simulato, aes(intervalli1)) + 
	geom_histogram(binwidth = 0.5) +
	labs(title="Istogramma",
			 subtitle="", 
			 caption="")

plot(sim_hist)

```

---

```{r sim_density, echo=FALSE}
sim_density <- ggplot(data=df_simulato, aes(intervalli1)) + 
	geom_density(aes(fill=factor(nominale)), alpha=0.5) +
	labs(title="Density plot",
			 x="intervalli 1",
			 subtitle="", 
			 caption="")

plot(sim_density)

```

---

```{r sim_scatter, echo=FALSE}
sim_scatter <- ggplot(df_simulato, aes(x=intervalli1, y=intervalli2)) + 
	geom_point(aes(col=nominale)) +  # , size=scol
	labs(
		title="Scatterplot", 
		subtitle="", 
		y="intervalli 2", 
		x="intervalli 1", 
		caption = "")

plot(sim_scatter)

```

---

```{r sim_boxplot, echo=FALSE}
sim_boxplot <- ggplot(data=df_simulato, aes(nominale,intervalli1)) + 
	geom_boxplot(varwidth=T) + # , fill="plum"
	geom_jitter(width = .2, size=1, color="lightslateblue") +
	labs(title="Boxplot",
			 x="Variabile nominale",
			 y="Variabile ad intervalli",
			 subtitle="", 
			 caption="")

plot(sim_boxplot)

```


