Grafico a dispersione in R utilizzando ggplot2 con esempio
โก Riepilogo intelligente
Il grafico a dispersione in R utilizzando ggplot2 mappa due variabili continue sugli assi x e y con geom_point(). Questa guida illustra il gruppoping tramite colore, trasformazioni logaritmiche, linee di regressione adattate, etichette, sfaccettatura, correzioni di sovrapposizione, scale, temi e salvataggio.

Perchรฉ i grafici sono importanti nell'analisi dei dati
I grafici sono la terza parte del processo di analisi dei dati. La prima parte riguarda dati extracproduzione, la seconda parte tratta pulizia e manipolazione dei dati. Alla fine, potrebbe essere necessario per lo scienziato dei dati comunicare graficamente i suoi risultati.
Il flusso di lavoro di un data scientist รจ riassunto nell'immagine sottostante.
- Il primo compito di un data scientist รจ definire una domanda di ricerca. Questa domanda di ricerca dipende dagli obiettivi e dagli scopi del progetto.
- Successivamente, uno dei compiti piรน importanti รจ l'ingegneria delle funzionalitร . Il data scientist deve raccogliere, manipolare e pulire i dati
- Una volta completato questo passaggio, puรฒ iniziare a esplorare il set di dati. A volte รจ necessario affinare e modificare l'ipotesi originale a causa di una nuova scoperta.
- Quando il esplicativo una volta raggiunta l'analisi, il data scientist deve considerare la capacitร del lettore di farlo comprendere i concetti e i modelli sottostanti.
- I suoi risultati dovrebbero essere presentati in un formato comprensibile a tutte le parti interessate. Uno dei metodi migliori per comunicare i risultati sono attraverso a grafico.
- I grafici sono uno strumento incredibile per semplificare analisi complesse.
Il resto di questo tutorial illustra come creare questi grafici utilizzando il pacchetto ggplot2.
Il pacchetto ggplot2
Questo tutorial si concentra sulla creazione di grafici in R con ggplot2.
In questo tutorial, utilizzerai il pacchetto ggplot2. Il pacchetto implementa la grammatica della grafica descritta da Leland Wilkinson nel 2005. ggplot2 รจ flessibile, include molti temi e ti permette di specificare un grafico ad un alto livello di astrazione.tracNota che non produce grafici tridimensionali o interattivi; per questi sono necessari pacchetti come plotly o rgl.
In ggplot2, un grafico รจ composto dai seguenti argomenti:
- dati
- mappa esteticaping
- oggetto geometrico
- trasformazioni statistiche
- bilancia
- sistema di coordinate
- aggiustamenti di posizione
- sfaccettatura
Imparerai come controllare questi argomenti nel tutorial.
La sintassi di base di ggplot2 รจ:
ggplot(data, mapping=aes()) + geometric object arguments: data: Dataset used to plot the graph mapping: Control the x and y-axis geometric object: The type of plot you want to show. The most common object are: - Point: `geom_point()` - Bar: `geom_bar()` - Line: `geom_line()` - Histogram: `geom_histogram()`
Come creare un diagramma a dispersione in R
Vediamo come funziona ggplot con il set di dati mtcars. Si inizia tracciando un grafico a dispersione della variabile mpg e della variabile drat.
Grafico a dispersione di base
library(ggplot2) ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point()
Code Spiegazione
- Per prima cosa passi il set di dati mtcars a ggplot.
- All'interno dell'argomento aes() aggiungi l'asse x e l'asse y.
- Il segno + significa che vuoi che R continui a leggere il codice. Rende il codice piรน leggibile rompendolo.
- Utilizzare geom_point() per l'oggetto geometrico.
Produzione:
Grafico a dispersione con gruppi
A volte puรฒ essere interessante distinguere i valori in base a un gruppo di dati (ad esempio dati a livello di fattore).
ggplot(mtcars, aes(x = mpg, y = drat)) + geom_point(aes(color = factor(gear)))
Code Spiegazione
- La funzione aes() all'interno di geom_point() controlla il colore di ciascun gruppo. Il gruppoping La variabile deve essere un fattore, quindi l'ingranaggio รจ racchiuso in factor().
- Complessivamente, hai il codice aes(color = factor(gear)) che cambia il colore dei punti.
Produzione:
Modifica la scala dell'asse con una trasformazione logaritmica.
La riscalatura dei dati รจ una parte importante del lavoro dell'analista, perchรฉ le variabili grezze raramente presentano una forma a campana regolare. L'applicazione del logaritmo รจ un modo per comprimere i valori estremi e rendere il grafico meno sensibile ai valori anomali.
ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear)))
Code Spiegazione
- Le variabili x e y vengono trasformate direttamente nella funzione log() all'interno della funzione aes() map.ping.
Si noti che รจ possibile applicare qualsiasi altra trasformazione come la standardizzazione o la normalizzazione.
Produzione:
Grafico a dispersione con valori adattati
ร possibile aggiungere un altro livello di informazioni al grafico. ร possibile sovrapporre i valori stimati di un regressione lineare.
my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear))) + stat_smooth(method = "lm", col = "#C42126", se = FALSE, size = 1) my_graph
Code Spiegazione
- my_graph: il grafico viene memorizzato nell'oggetto my_graph, in modo che i passaggi successivi possano aggiungere livelli senza ripetere l'intera chiamata
- L'argomento stat_smooth() controlla il metodo di smoothing
- metodo = โlmโ: Regressione lineare
- col = โ#C42126โ: Code per il colore rosso della linea
- se = FALSE: non visualizzare l'errore standard
- size = 1: lo spessore della linea. In ggplot2 3.4.0 e versioni successive questo argomento รจ stato rinominato linewidth per le geometrie di linea.
Produzione:
Tieni presente che sono disponibili altri metodi di livellamento
- glm
- gam
- loess: il metodo predefinito per meno di 1,000 osservazioni
- rlm: modello lineare robusto, dal pacchetto MASS
Prima di personalizzare lo stile del grafico, รจ utile sapere quando un grafico a dispersione rappresenta la scelta piรน appropriata.
Diagramma a dispersione vs grafico a linee vs Bubble Grafico in R
Tutti e tre i grafici mettono in relazione due variabili continue, quindi la scelta dipende da cosa il lettore dovrebbe trarne.
| Criteri | Grafico a dispersione | Grafico a linee | Bubble Grafico |
|---|---|---|---|
| Spettacoli | Correlazione tra due variabili | Variazione di una variabile lungo un asse ordinato | Correlazione piรน una terza grandezza |
| Asse X | Qualsiasi variabile continua | Di solito il tempo o un'altra scala ordinata | Qualsiasi variabile continua |
| Ordine dei punti | Irrilevante | Punti critici, sono collegati | Irrilevante |
| Terza variabile | Attraverso il colore o la forma | Attraverso linee separate | Attraverso la dimensione del punto |
| chiamata ggplot2 | geom_point() | linea_geometrica() | geom_point(aes(size = z)) |
Collegare i punti di dispersione con una linea quando l'asse x non ha un ordine naturale รจ un errore comune: implica una sequenza che non esiste. Riserva geom_line() per assi ordinati come le date. Per le distribuzioni di una singola variabile, usa un trama a scatola anzichรฉ.
Aggiungi informazioni al grafico
Finora i grafici non contengono testo esplicativo. Il lettore dovrebbe essere in grado di cogliere il significato dei dati direttamente dal grafico, senza dover consultare ulteriore documentazione; ciรฒ significa che il grafico necessita di etichette chiare. ร possibile aggiungere etichette con la funzione labs().
La sintassi di base per labs() รจ:
labs(title = "Hello Guru99") arguments: - title: Main title displayed above the plot - subtitle: Secondary line below the title - caption: Note below the plot, usually the data source - x: Rename the x-axis - y: Rename the y-axis - color / fill: Rename the legend Example: labs(title = "Hello Guru99", subtitle = "My first plot")
Aggiungi un titolo
Un'informazione obbligatoria da aggiungere รจ ovviamente il titolo.
my_graph +
labs(
title = "Plot Mile per hours and drat, in log"
)
Code Spiegazione
- my_graph: usi il grafico che hai memorizzato. Evita di riscrivere tutti i codici ogni volta che aggiungi nuove informazioni al grafico.
- Il titolo va racchiuso tra le parentesi quadre (labs()).
Produzione:
Aggiungi un titolo con un nome dinamico
Un titolo dinamico รจ utile per aggiungere informazioni piรน precise nel titolo.
ร possibile utilizzare la funzione paste() per stampare testo statico e testo dinamico. La sintassi di base di paste() รจ:
paste("This is a text", A) arguments - " ": Text inside the quotation marks are the static text - A: Display the variable stored in A - Note you can add as much static text and variable as you want. You need to separate them with a comma
Esempio:
A <- 2010
paste("The first year is", A)
Produzione:
## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)
Produzione:
## [1] "The first year is 2010 and the last year is 2018"
Puoi aggiungere un nome dinamico al nostro grafico, ovvero la media di mpg.
mean_mpg <- mean(mtcars$mpg) my_graph + labs( title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg) )
Code Spiegazione
- Crei la media di mpg con mean(mtcars$mpg) memorizzata nella variabile mean_mpg
- Utilizzi paste() con mean_mpg per creare un titolo dinamico che restituisca il valore medio di mpg
Produzione:
Aggiungi un sottotitolo
Altri due dettagli rendono il grafico piรน esplicito. Ti riferisci al sottotitolo e alla didascalia. Il sottotitolo va posizionato subito sotto il titolo. La didascalia puรฒ fornire informazioni su chi ha eseguito il calcolo e sulla fonte dei dati.
my_graph +
labs(
title =
"Relation between Mile per hours and drat",
subtitle =
"Relationship break down by gear class",
caption = "Authors own computation"
)
Code Spiegazione
- All'interno di labs(), hai aggiunto:
- title = โRapporto tra miglia orarie e dratโ: aggiungi titolo
- sottotitolo = โRelazione suddivisa per classe di ingranaggioโ: aggiungi sottotitolo
- caption = โCalcolo dell'autore: aggiungi didascalia
- Separa ogni nuova informazione con una virgola, ,
- Tieni presente che interrompi le righe di codice. Non รจ obbligatorio e aiuta solo a leggere piรน facilmente il codice
Produzione:
Rinominare asse x e asse y
I nomi delle colonne raramente sono pronti per la presentazione. Spesso sono abbreviati o utilizzano trattini bassi tra le parole, come in GDP_CAP. Rinominateli direttamente nel grafico e aggiungete le unitร di misura dove necessario.
my_graph +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Code Spiegazione
- All'interno di labs(), hai aggiunto:
- x = โDefinizione Dratโ: cambia il nome dell'asse x
- y = โMiglia all'oraโ: cambia il nome dell'asse y
Produzione:
Controlla la bilancia
ร possibile controllare la scala dell'asse.
La funzione seq() รจ utile quando รจ necessario creare una sequenza di numeri. La sintassi di base รจ:
seq(begin, last, by = x)
arguments:
- begin: First number of the sequence
- last: Last number of the sequence
- by= x: The step. For instance, if x is 2, the code adds 2 to `begin-1` until it reaches `last`
Ad esempio, un intervallo da 0 a 12 con un passo di 4 restituisce quattro numeri: 0, 4, 8 e 12.
seq(0, 12,4)
Produzione:
## [1] 0 4 8 12
ร possibile controllare la scala dell'asse x e dell'asse y come di seguito
my_graph +
scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Code Spiegazione
- La funzione scale_y_continuous() controlla il asse y
- La funzione scale_x_continuous() controlla il asse x.
- Il parametro break controlla la divisione dell'asse. Puoi aggiungere manualmente la sequenza di numeri o utilizzare la funzione seq():
- seq(1, 3.6, by = 0.2): Crea la sequenza da 1 a 3.6 con incrementi di 0.2, ovvero 14 punti di interruzione
- seq(1, 1.6, by = 0.1): Crea sette numeri da 1 a 1.6 con incrementi di 0.1
Produzione:
Tema
Infine, ggplot2 permette di personalizzare l'intero grafico con una singola funzione tema. Il pacchetto include otto temi completi:
- tema_bw()
- tema_luce()
- tema_classico
- tema_linedraw()
- tema_scuro()
- tema_minimo()
- tema_grigio()
- tema_void()
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Produzione:
Salva trame
Dopo tutti questi passaggi, รจ il momento di salvare e condividere il grafico. Chiama ggsave("nome_del_file.png") subito dopo aver tracciato il grafico e l'immagine verrร salvata su disco.
Il grafico viene salvato nella directory di lavoro. Per controllare la directory di lavoro, puoi eseguire questo codice:
directory <- getwd() directory
Traccia il grafico finale, salvalo e verifica dove si รจ posizionato:
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Produzione:
ggsave("my_fantastic_plot.png")
Produzione:
## Saving 5 x 4 in image
Note:: Solo a scopo pedagogico, abbiamo creato una funzione chiamata open_folder() per aprire la cartella della directory per te. Devi solo eseguire il codice seguente e vedere dove รจ archiviata l'immagine. Dovresti vedere un file chiamato my_fantastic_plot.png.
# Run this code to create the function open_folder <- function(dir) { if (.Platform['OS.type'] == "windows") { shell.exec(dir) } else { system(paste(Sys.getenv("R_BROWSER"), dir)) } } # Call the function to open the folder open_folder(directory)
Come creare grafici a dispersione sfaccettati in R con facet_wrap()
La suddivisione in pannelli (faceting) รจ uno degli otto componenti di ggplot2 elencati in precedenza ed รจ la soluzione piรน elegante per un grafico troppo affollato. Invece di comprimere ogni gruppo in un unico pannello, ggplot2 disegna un piccolo multiplo per ogni livello di una variabile, tutti sulla stessa scala, in modo che i pannelli rimangano confrontabili.
# One panel per gear count ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() + facet_wrap(~ gear) + theme_classic()
Tre argomenti svolgono la maggior parte del lavoro.
- col or ora: forza i pannelli in un determinato layout, ad esempio facet_wrap(~ gear, ncol = 2).
- bilancia: "fisso" per impostazione predefinita, quindi ogni pannello condivide un intervallo di assi. Utilizzare "free_y" o "free" quando i gruppi differiscono notevolmente in termini di magnitudine, ma tenere presente che le scale libere rendono fuorvianti i confronti visivi tra i pannelli.
- etichettatrice: sostituisce il livello del fattore grezzo in ogni striscia, ad esempio labeller = label_both per stampare "ingranaggio: 4" invece di "4".
Due gruppiping variabili. Utilizza facet_grid() per costruire una matrice di pannelli, con la prima variabile che si distribuisce sulle righe e la seconda sulle colonne:
ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point(aes(color = factor(cyl))) + facet_grid(am ~ gear) + theme_classic()
Sfaccettature o colori? L'uso del colore funziona bene fino a circa quattro gruppi su un grafico con sovrapposizione limitata. Oltre questo limite, o quando i gruppi si sovrappongono in modo significativo, la suddivisione in pannelli รจ piรน facile da leggere perchรฉ ogni pannello contiene solo i propri punti. ร possibile combinare entrambi i metodi: suddivisione in pannelli in base a una variabile e colorazione in base a un'altra, come nell'esempio facet_grid() riportato sopra.
Come gestire la sovrapposizione di elementi nei diagrammi a dispersione in R
Con poche decine di osservazioni ogni punto รจ visibile. Con migliaia, i marcatori si sovrappongono e la regione piรน densa appare semplicemente come una macchia solida. Questo รจ trama eccessivae ggplot2 offre quattro soluzioni standard.
1. Ridurre l'opacitร . La soluzione piรน economica. Sovrapposizioneping I punti si scuriscono naturalmente, rendendo cosรฌ visibile la densitร :
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + theme_classic()
2. Jitter valori discreti. Quando una variabile assume solo pochi valori, i punti si trovano sulle stesse coordinate. Un piccolo spostamento casuale li separa:
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) + geom_jitter(width = 0.15, height = 0) + theme_classic()
Imposta height = 0 in modo che i valori y, che contengono le informazioni reali, non vengano mai modificati.
3. Butta via l'aereo. Per set di dati di grandi dimensioni, conta le osservazioni per cella e associa il conteggio al colore. I bin esagonali evitano gli artefatti visivi prodotti dai bin quadrati:
ggplot(diamonds, aes(x = carat, y = price)) + geom_hex(bins = 40) + theme_classic()
4. Tracciare le curve di livello di densitร . Le linee di contorno delineano le regioni in cui si concentrano le osservazioni e si sovrappongono ordinatamente ai punti sbiaditi:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + geom_density_2d(color = "#C42126") + theme_classic()
In linea di massima, la suddivisione in intervalli alfa รจ adatta per poche migliaia di punti, la suddivisione in intervalli esagonali per decine di migliaia, mentre per quantitร superiori l'opzione piรน pragmatica รจ il campionamento dei dati con dplyr::slice_sample().
Diagramma a dispersione in R: Code Referenze
La tabella seguente elenca la chiamata a ggplot2 per ciascuna delle opzioni sopra descritte:
| Obiettivo | Code |
|---|---|
| Grafico a dispersione di base |
ggplot(df, aes(x = x1, y = y)) + geom_point() |
| Grafico a dispersione con gruppo di colori |
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2))) |
| Aggiungi valori adattati |
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm") |
| Aggiungi titolo |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99")) |
| Aggiungi sottotitoli |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99")) |
| Rinomina X |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1") |
| Rinomina Y |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1") |
| Controlla la scala |
ggplot(df, aes(x = x1, y = y)) + geom_point() + scale_y_continuous(breaks = seq(10, 35, by = 10)) + scale_x_continuous(breaks = seq(2, 5, by = 1)) |
| Crea log |
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point() |
| Tema |
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic() |
| Sfaccettato da un gruppo |
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2) |
| Gestione della sovrapposizione |
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3) |
| Salva |
ggsave("my_fantastic_plot.png")
|












