Abbiamo visto che in ggplot2 è possibile:
geom_point(col = “red”) o geom_barplot(fill = “red”)); oppuregeom_point(aes(col = x)) o geom_barplot(aes(fill = x)));vedi ggplot
Quando una variabile viene mappata per la selezione dei colori, viene prodotta anche una legenda.
A seconda del tipo di carattere rappresentato, vengono usate scale di colori diverse, ad esempio:
In particolare, per i caratteri continui, vengono utilizzate/create palette sequenziali (a gradiente), e divergenti (colori opposti e brillanti agli estremi, che sfumano al centro); per i caratteri discreti vengono invece utilizzate/create palette qualititative, con colori diversi fra di loro, ma di pari intensità/luminosità.
Tali scale possono essere modificate con una serie di funzioni che:
scale_;color_ (o colour_, è uguale) se l'argomento da utilizzare è col = ; da fill_ se l'argomento da utilizzare è fill = .
Ad esempio se abbiamo aes(col = x), useremo una funzione che inizia per scale_color_…(), mentre per aes(fill = x) indicheremo i colori con scale_fill_…():
aes(col = x) + scale_color_…()aes(fill = x) + scale_fill_…()| funzione (scale_color_/scale_fill_) | carattere |
|---|---|
| brewer(palette = ) | discreto, scale brewer |
| distiller(palette = ) | continuo, scale brewer |
| gradient, gradient2, gradientn | continuo (sequenziale, divergente, toni di grigio) |
| manual | discreto, per indicare i colori |
| grey | discreto |
| hue | discreto |
| identity | per usare una variabile |
Queste funzioni consentono anche di attribuire un nome arbitrario alla legenda, o di eliminarla:
# Pacchetti library(tidyverse) library(carData)
ColorBrewer è uno strumento online per la selezione di palette di colori, e che offre diverse opzioni di palette di colori accessibili e distinguibili, suddivise fra sequenziali, divergenti e qualitative (<https://colorbrewer2.org>).
Per usare queste gamme di colori, integrate in ggplot2, si possono usare:
scale_color_brewer() e scale_fill_brewer()per valori discretiscale_color_distiller() e scale_fill_distiller() per valori continuiQueste funzioni richiedono di indicare la palette brewer con un numero, ma possono essere usate anche con quelle standard, indicandole per nome. Queste saranno appropriatamente trasformate in rapporto al tipo di carattere rappresentato.
Fra tutte le funzioni indicate in tabella, queste sono piuttosto semplici, molto versatili, oltreché facili da ricordare. In realtà, infatti, anche se sono quattro, si tratta di ricordare brewer per i valori discreti e distiller per i valori continui.
scale_color_distiller() e scale_fill_distiller():
# distiller Orange %>% mutate("scarti" = circumference - mean(circumference)) %>% ggplot(aes(x = Tree, y = scarti)) + geom_col(width = 0.7, aes(fill = scarti)) + ylab("circumference (scarti)") + theme_minimal() + coord_flip() + scale_fill_distiller(palette = "Greens", guide = FALSE) # senza legenda
Vedi anche grafici a barre, figura 6
# brewer SLID %>% ggplot(aes(education, wages)) + # valore discreto da rappresentare con i colori geom_point(aes(col = sex)) + scale_color_brewer(palette = "Set1")
Orange %>% ggplot(aes(Tree, circumference)) + geom_boxplot(aes(fill = Tree)) + scale_fill_brewer(palette = "PuBuGn")
Particolarmente utile è rappresentare i grafici in bianco e nero: spesso tesi, report e pubblicazioni scientifiche non prevedono l'uso del colore.
A tale scopo, per i caratteri continui, possiamo usare:
scale_color_distiller(palette = “Greys”), o scale_fill_distiller(palette = “Greys”)
e magari scegliere il tema in bianco e nero con theme_bw()
cars %>% ggplot(aes(speed, dist, col = speed)) + geom_point() + scale_color_distiller(palette = "Greys") + theme_bw()
mtcars %>% ggplot(aes(wt, mpg)) + geom_point(aes(col = cyl), size = 2) + scale_color_distiller(palette = "Greys", # cambiare la direzione dei colori direction = 1) + labs(x = "Peso", y = "Miglia/Gallone", col = "Cilindrata", caption = "Dataset: mtcars") + theme_bw()
Per i caratteri discreti è possibile usare:
scale_color_brewer(palette = “Greys”), o scale_fill_brewer(palette = “Greys”)scale_color_grey() / scale_fill_grey()Orange %>% ggplot(aes(x = Tree, y = circumference, fill = Tree)) + geom_boxplot(alpha = 0.8) + labs(fill = NULL) + scale_fill_grey() + theme_bw()
oppure
Orange %>% ggplot(aes(x = Tree, y = circumference, fill = Tree)) + geom_boxplot(alpha = 0.8) + labs(fill = NULL) + scale_fill_brewer(palette = "Greys") + theme_bw()
Per i valori continui, le funzioni da usare per definire “a mano” i colori per valori continui sono quelle della famiglia scale_color_gradient() / scale_fill_gradient(), che collegano le intensità dei valori e intensità di uno o più colori.
scale_color_gradient(low = "orange", high = "darkblue")
scale_color_gradient2(low = "orange", mid = "white", high = "darkblue")
scale_color_gradient(low = "grey80", high = "grey10")
Per i valori discreti, useremo scale_fill_manual():
scale_fill_manual(values = c("red", "blue", "green"))
In tutti i casi, i colori potranno essere indicati
scale_color_gradient(low = 1, high = 5)
scale_fill_manual(values = palette()[c(4,3,5)])
La funzione è scale_color_gradient() / scale_fill_gradient(). Crea una palette sequenziale (a gradiente), e richiede indicare i colori per i valori low e high della variabile mappata:
# gradient mtcars %>% ggplot(aes(wt, mpg)) + geom_point(aes(col = hp), size = 2) + scale_color_gradient(low = "lightgrey", high = "purple") + theme_minimal()
Si possono indicare anche i colori della palette in uso:
scale_color_gradient(low = 1, high = 5)
Di conseguenza, è possibile cambiare la palette:
palette("Accent") mtcars %>% ggplot(aes(wt, mpg)) + geom_point(aes(col = hp), size = 2) + scale_color_gradient(low = palette()[3], high = palette()[5]) + theme_minimal() palette("default")
La funzione scale_color_gradient2() / scale_fill_gradient2() consente di creare una palette divergente, e richiede di indicare i colori per i valori low, high e anche mid della variabile mappata. Di default il valore per mid è 0; nell'esempio che segue ho indicato la media, e ho tradotto il nome delle variabili, anche cambiando il titolo della legenda:
# gradient 2 mtcars %>% ggplot(aes(wt, mpg)) + geom_point(aes(col = hp), size = 2) + labs(x = "peso", y = "miglia") + scale_color_gradient2('cavalli', # titolo della legenda low = 'darkgreen', mid = 'yellow', high = 'red', midpoint = mean(mtcars$hp))
Abbastanza semplice, per i valori discreti, è indicare i colori con scale_fill_manual (o scale_fill_manual())
# manual SLID %>% ggplot(aes(sex)) + geom_bar(aes(fill = sex), width = 0.5) + scale_fill_manual(values=c("magenta", "blue"), guide=FALSE)
In questo modo, è anche molto semplice cambiare la palette (vedi Le palette).
palette(cm.colors(3)) SLID %>% na.omit(language) %>% ggplot(aes(language)) + geom_bar(aes(fill = language), width = 0.5) + scale_fill_manual(values=palette(), guide=FALSE) palette("default")
oppure
palette(cm.colors(3)) SLID %>% na.omit(language) %>% ggplot(aes(language)) + geom_bar(aes(fill = language), width = 0.5, col = "black") + scale_fill_manual(values=palette()[c(3,1,2)], guide=FALSE) palette("default")
La funzione scale_color_hue() non è molto semplice da usare, in quanto fa riferimento alla ruota dei colori. Con l'argomento h.start, si indica il punto di inizio (in gradi). È inoltre possibile specificare come dividere i colori, la luminosità, la saturazione ecc.
# hue SLID %>% ggplot(aes(education, wages)) + geom_point(aes(col = sex)) + scale_color_hue(h.start = 90) # cambio il punto sulla color wheel
Se la variabile mappata (o una diversa) è codificata in modo compatibile con la notazione dei colori (numeri o nomi dei colori), è possibile utilizzare scale_color_identity() o scale_fill_identity().
La legenda va aggiunta, perché di default non viene prodotta.
# identity ChickWeight %>% ggplot(aes(Time, weight)) + geom_point(aes(col = Diet)) + scale_color_identity(guide = "legend") # aggiungo la legenda
Anche in questo caso, possiamo cambiare la palette:
palette(rainbow(4)) ChickWeight %>% ggplot(aes(Time, weight)) + geom_point(aes(col = Diet)) + scale_color_identity(guide = "legend") # torno alla palette di default palette("default")
E' possibile scaricare ed eseguire lo script dell'esempio:
# Pacchetti library(tidyverse) library(carData) # distiller Orange %>% mutate("scarti" = circumference - mean(circumference)) %>% ggplot(aes(x = Tree, y = scarti)) + geom_col(width = 0.7, aes(fill = scarti)) + ylab("circumference (scarti)") + theme_minimal() + coord_flip() + scale_fill_distiller(palette = "Greens", guide = FALSE) # senza legenda # brewer SLID %>% ggplot(aes(education, wages)) + # valore discreto da rappresentare con i colori geom_point(aes(col = sex)) + scale_color_brewer(palette = "Set1") Orange %>% ggplot(aes(Tree, circumference)) + geom_boxplot(aes(fill = Tree)) + scale_fill_brewer(palette = "PuBuGn") # toni di grigio cars %>% ggplot(aes(speed, dist, col = speed)) + geom_point() + scale_color_distiller(palette = "Greys") + theme_bw() Orange %>% ggplot(aes(x = Tree, y = circumference, fill = Tree)) + geom_boxplot(alpha = 0.8) + labs(fill = NULL) + scale_fill_grey() + theme_bw() # gradient mtcars %>% ggplot(aes(wt, mpg)) + geom_point(aes(col = hp), size = 2) + scale_color_gradient(low = "lightgrey", high = "purple") + theme_minimal() # gradient2 mtcars %>% ggplot(aes(wt, mpg)) + geom_point(aes(col = hp), size = 2) + labs(x = "peso", y = "miglia") + scale_color_gradient2('cavalli', # titolo della legenda low = 'darkgreen', mid = 'yellow', high = 'red', midpoint = mean(mtcars$hp)) # manual SLID %>% ggplot(aes(sex)) + geom_bar(aes(fill = sex), width = 0.5) + scale_fill_manual(values=c("magenta", "blue"), guide=FALSE) # hue SLID %>% ggplot(aes(education, wages)) + geom_point(aes(col = sex)) + scale_color_hue(h.start = 90) # cambio il punto sulla colorwheel # identity ChickWeight %>% ggplot(aes(Time, weight)) + geom_point(aes(col = Diet)) + scale_color_identity(guide = "legend") # aggiungo la legenda