ggplot2
Tot i que R base conté algunes funcions per fer gràfics, utilitzarem
el paquet ggplot2
que forma part de tidyverse
.
Farem servir el dataset de mostra que vam emprar en el primer
tema per fer alguns gràfics.
library(tidyverse)
dades <- read.table(file = "mostra.txt",
header = TRUE,
sep = "\t",
dec = ",")
Els gràfics ggplot
tenen tres arguments:
-data: un data.frame amb les dades que volem representar
-aes() aesthetics: permet definir les variables (x, y), el color, la mida, la forma, etc.
-geom() geometry: permet definir el tipus de gràfic (dispersió, barres, línies, etc.).
Per fer un gràfic, comencem amb la funció ggplot especificant les variables que volem representar a l’eix horitzontal (x) i vertical (y).
ggplot(dades, aes(x = Edat, y = Pes))
La funció anterior simplement ha creat el llençol sobre el qual fer el gràfic. Amb la geometria, especifiquem el tipus de gràfic que volem representar:
geom_point(): diagrames de dispersió amb dues variables quantitatives (scatter plot)
geom_bar(): gràfics de columnes i barres
geom_histogram(): histogrames
geom_boxplot(): diagrames de caixa (boxplot)
geom_tile(): mapes de calor (heatmap)
geom_line(): gràfics de línies
Començarem amb un diagrama de dispersió per representar l’edat i el pes dels 50 subjectes del dataset.
ggplot(dades, aes(x = Edat, y = Pes)) +
geom_point()
Podem agregar propietats a cadascun dels elements visuals del gràfic i proporcionar informació addicional o simplement millorar l’estètica.
color: classifica els casos per colors segons una altra variable
fill: similar a color però per a les geometries que tenen àrea interior
size: defineix la mida de les geometries, per exemple, les dimensions dels punts
alpha: defineix la transparència de les geometries (per exemple, quan hi ha punts que se superposen). Els valors poden anar de 0 a 1.
Per exemple, en el següent gràfic, assignarem un color als punts en funció del gènere del subjecte i els farem més grossos.
ggplot(dades, aes(x = Edat, y = Pes, color = Genere)) +
geom_point(size = 3, alpha = 0.8)
Farem ara un gràfic de barres per representar els colors favorits dels subjectes presents al dataset.
ggplot(dades, aes(x = Color)) +
geom_bar()
Podem fer servir dos colors diferents per representar el gènere dels subjectes.
ggplot(dades, aes(x = Color, fill = Genere)) +
geom_bar()
Si volem que les barres siguin horitzontals, simplement hem d’afegir
(amb el simbol +
) l’argument coord_flip()
.
ggplot(dades, aes(x = Color, fill = Genere)) +
geom_bar() +
coord_flip()
Els histogrames s’utilitzen per representar variables quantitatives contínues, com ara el pes dels subjectes.
ggplot(dades, aes(x = Pes)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Farem un diagrama de caixes per representar l’edat dels subjectes
segons el seu gènere. En els gràfics anteriors hem vist que, per
defecte, els gràfics de ggplot
es creen sobre un fons gris
amb línies blanques de quadrícula. Hi ha altres themes que
podeu fer servir com theme_bw()
,
theme_minimal()
, theme_classic()
,
theme_light()
, theme_dark()
,
theme_void()
, etc.
ggplot(dades, aes(x = Genere, y = Edat)) +
geom_boxplot() +
theme_minimal()
Un mapa de calor (heatmap) és útil per visualitzar valors numèrics associats a dues variables categòriques mitjançant una escala de colors. Representarem els colors favorits per gènere. Primer, calculem els valors i, a continuació, elaborem el gràfic.
df <- dades %>%
count(Genere, Color)
ggplot(df, aes(x = Color, y = Genere, fill = n)) +
geom_tile() +
scale_fill_gradient(low = "white", high = "steelblue")
Els gràfics de línies són útils per il·lustrar tendències temporals. En el nostre dataset no hi ha dades d’aquest tipus. Importarem un dataset disponible en Internet amb l’evolució del preu del bitcoin entre 2013 i 2018 i el representarem gràficament. Observeu el codi i els comentaris en color verd.
bitcoin <- read.table("https://bit.ly/3dyZXbz", header = T) # Importem el dataset
bitcoin$date <- as.Date(bitcoin$date) # Convertim el camp "date" a format "data"
graf.bitcoin <- ggplot(bitcoin, aes(x = date, y = value)) +
geom_line() +
xlab("Evolució del preu del bitcoin") +
ylab("Dòlars") +
theme_classic()
graf.bitcoin
En ocasions és útil fer els nostres gràfics interactius, per exemple
si volem publicar-los a una pàgina web. El paquet plotly
ens permet fer-lo de manera sencilla amb la funció
ggplotly
.
Animarem el gràfic sobre el valor del bitcoin. Observa que, al pasar el cursor sobre la línia pots consultar el valor del bitcoin en una data determinada.
library(plotly)
graf.bitcoin.interactiu <- plotly::ggplotly(graf.bitcoin)
graf.bitcoin.interactiu
Farem un segon gràfic fent servir el dataset gapminder
que inclou dades demográfiques de països del món, com ara l’esperança de
vida, la població o el PIB per càpita, i ve precarregat en R.
library(gapminder)
head(gapminder)
Filtrarem les dades corresponents a 2007, que és l’últim any disponible, i farem un diagrama de dispersió.
dades.2007 <- gapminder %>% filter(year == 2007)
graf.2007 <- ggplot(dades.2007, aes(x = gdpPercap, y = lifeExp,
size = pop,
color = continent,
label = country)) +
geom_point()
graf.2007
Finalment, fem el gràfic interactiu per poder consultar la informació sobre cada país.
graf.2007.int <- ggplotly(graf.2007,
tooltip = c("label", "size", "color"))
graf.2007.int
Una altra opció és animar un gràfic amb el paquet
gganimate
. Per al següent exemple, farem servir un
dataset disponible en R anomenat babynames
que
inclou la freqüència dels noms de nadons als Estats Units des de 1880.
En primer lloc, carreguem les dades i visualitzem els primers registres
per fer-nos una idea de la seva estructura.
library(gganimate)
library(babynames)
library(gifski)
head(babynames)
Filtrarem tres noms concrets que seran els representarem gràficament: Ashley, Patricia i Helen.
noms <- babynames %>%
filter(name %in% c("Ashley", "Patricia", "Helen")) %>%
filter(sex=="F")
head(noms)
Ara creem el gràfic fent servir algunes de les funcions que hem vist
de ggplot
.
graf.noms <- ggplot(noms, aes(x = year, y = n, group = name, color = name)) +
geom_line(linewidth = 1.2) +
geom_point(size = 2) +
ggtitle("Popularitat de tres noms als Estats Units") +
ylab("Nombre de nadons") +
theme_minimal(base_size = 14) +
gganimate::transition_reveal(year)
graf.noms
Farem un segon gràfic amb l’evolució de població, PIB i esperança de vida a Espanya. Primer filtrem les dades d’Espanya i, a continuació, elaborem el gràfic.
spain <- gapminder %>% filter(country == "Spain")
graf.spain <- ggplot(spain, aes(x = gdpPercap, y = lifeExp,
size = pop)) +
geom_point() +
gganimate::transition_reveal(year)
graf.spain
El paquet ggplot
en combinació amb maps
també permet fer mapes. Podem començar, simplement, dibuixant els països
del món.
library(maps)
ggplot() + borders("world")
Podem seleccionar només alguns països.
ggplot() + borders("world", c("spain",
"portugal",
"france",
"italy",
"switzerland"))
He creat un petit dataset amb les coordenades geogràfiques d’una desena de ciutats.
ciutats <- read.table("ciutats.txt", header = TRUE, sep = "\t")
head(ciutats)
Ara ubiquem aquestes ciutats al mapa.
ggplot(ciutats) + borders("world", c("spain", "portugal")) +
aes(x = lon, y = lat) +
geom_point() +
theme_minimal()
Anem a fer el mateix mapa, però posant els noms de les ciutats. Compareu el codi per determinar com influeix sobre la visualització.
ggplot(ciutats) + borders("world", fill = "white") +
geom_point(data = ciutats, aes(x = lon, y = lat)) +
geom_text(data = ciutats, aes(x = lon, y = lat, label = ciutat)) +
coord_fixed (xlim= c(-10,10),
ylim= c(35,45),
ratio = 1.2)
Farem ara un mapa de comunitats autònomes espanyoles. El paquet
mapSpain
proporciona els mapes d’Espanya amb divisions
administratives, mentre que sf
ens permet treballar amb
dades espacials i scales
millorar algunes qüestions
relatives a la presentació de xifres.
library(mapSpain)
library(sf)
library(scales)
Obtenim, en primer lloc, les dades espacials de les comunitats autònomes.
ccaa_map <- esp_get_ccaa()
A continuació, creem el mapa.
ggplot(ccaa_map) +
geom_sf(fill = "lightblue", color = "black") +
theme_minimal()
Un mapa coroplètic o de coropletes és un mapa temàtic que utilitza un color per representar una variable quantitativa, que en aquest cas serà la població de cada comunitat autònoma.
El primer pas consisteix, doncs, a obtenir les dades de població. En aquest cas, el fitxer amb les dades l’hem obtingut de l’INE: https://www.ine.es/jaxiT3/Datos.htm?t=2915
poblacion <- read.csv("2915.csv",
fileEncoding = "latin1",
header = T,
sep = "\t")
head(poblacion)
Cal separar, a la primera columna, el codi de la comunitat autònoma del seu nom.
poblacion <- poblacion %>%
separate(Comunidades.y.Ciudades.Autónomas,
into = c("codi", "comunidad"),
sep = " ",
extra = "merge")
## Warning: Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [1].
D’altra banda, també cal convertir les xifres de població a format numèric (ara estan en format “caràcter”).
poblacion <- poblacion %>%
mutate(Total = as.numeric(gsub("\\.", "", Total)))
A continuació, unim el mapa amb les dades de població pel camp comú que tenen els dos dataframes.
ccaa_map_pob <- ccaa_map %>%
left_join(poblacion, by = c("codauto" = "codi"))
head(ccaa_map_pob)
Convertim les xifres de població a format numèric.
ccaa_map_pob <- ccaa_map_pob %>%
mutate(Total = as.numeric(gsub("\\.", "", Total)))
Ara ja podem crear el mapa.
ggplot(ccaa_map_pob) +
geom_sf(aes(fill = Total), color = "white") +
scale_fill_gradient(
name = "Població",
low = "#dceefb", # blau clar
high = "#0747a6", # blau fosc
labels = label_comma(big.mark = ".")) +
labs(
title = "Població per Comunitats Autònomes",
caption = "Font: Instituto Nacional de Estadística") +
theme_minimal()
Farem un mapa amb OpenStreetMap, una eina similar a Google Maps però
amb llicència oberta. Necessitarem el paquet leaflet
.
library(leaflet)
Podem representar un o diversos punts al mapa indicant les seves coordenades.
leaflet() %>%
addTiles() %>% # afegeix les "teselas" que formen el mapa
addMarkers(lng=2.1390, lat=41.3812, popup="Som a classe de Dades Massives a la FIMA!")
El curs passat una companya vostra va voler fer un mapa dels Estats Units indicant algunes ciutats que havia visitat. Reprodueixo a continuació el procés que vam seguir.
En primer lloc, vam descarregar les dades que estan disponibles a
maps
, el paquet que vam descarregar a l’inici d’aquest
apartat. La funció map_data
inclou alguns mapes
preconfigurats, entre ells un dels estats d’Estats Units. El data.frame
inclou un llistat de punts que, units, configuren les fronteres dels
estats.
us_states <- map_data("state")
head(us_states)
Convertirem aquestes dades en un gràfic que guardarem en un objecte
anomenat mapa.USA
per millorar-lo progressivament.
mapa.USA <- ggplot() +
geom_polygon(data = us_states, aes(x = long, y = lat, group = group), color = "black", fill = "white")
mapa.USA
Etiquetarem cada estat amb el seu nom. Per fer-lo, en primer lloc
obtindrem les coordenades del centre de cada estat. El següent codi suma
la latitud i la longitud dels punts que representen cada estat i calcula
la mitjana. Guardem aquesta informació en un objecte que anomenem
centre
.
centre <- aggregate(cbind(long, lat) ~ region, data = us_states, FUN = mean)
head(centre)
Si posem el nom sencer de cada estat al mapa, ocuparan massa espai,
de manera que anomenarem cada estat amb les seves inicials (les dues
primeres lletres) que obtindrem dels noms que figuren al
dataset. Amb el següent codi, extreiem les incials del camp
“region” i les afegim a una nova columna. La funció toupper
serveix per posar-les en majúscules.
centre$inicials <- toupper(substr(centre$region, 1, 2))
head(centre)
Ara afegim aquestes inicials al mapa.
mapa.USA <- mapa.USA +
geom_text(data = centre, aes(x = long, y = lat, label = inicials), size = 3)
mapa.USA
El següent codi sobretot millora qüestons estètiques. Afegim un títol i eliminem els títols dels eixos (la latitud i la longitud).
mapa.USA <- mapa.USA +
ggtitle("Ciutats dels EUA que recomano visitar") +
theme(axis.line = element_blank(),
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank())
mapa.USA
Ara afegirem les ciutats. Podríem crear el dataset amb Excel o el bloc de notes i importar-lo. No obstant això, en aquest cas el crearem directament en R.
US_cities <- data.frame(
ciutat = c("Houston","Minneapolis", "Nova York", "San Francisco", "Seattle"),
latitud = c(29.7558, 44.9424, 40.7128, 37.7631, 47.6062),
longitud = c(-95.3802, -94.9147, -74.0060, -119.6559, -122.3321))
head(US_cities)
Només ens queda situar les ciutats al mapa. Ho farem amb punts de color verd.
mapa.USA <- mapa.USA +
geom_point(data = US_cities, aes(x = longitud, y = latitud, text = ciutat), color = "green", size = 3)
mapa.USA
Afegirem el mapa interactiu perquè, en passar el ratolí apareguin els noms.els noms
mapa.USA.int <- plotly::ggplotly(mapa.USA, tooltip = "text")
mapa.USA.int
L’exercici té quatre parts. Com és habitual, les tres primeres són obligatòries i la quarta és opcional.
Per donar resposta a l’exercici cal lliurar dos arxius a través del Campus Virtual: l’script de R que heu fet servir i un document en PDF explicant les característiques dels gràfics i mapes que heu elaborat.
Utilitza els datasets comentats en aquest document per crear tres gràfics de diferent tipus (dispersió, columnes, diagrama de caixa, etc.). Intenta millorar l’estètica dels gràfics tant com et sigui possible.
Elabora un gràfic de línies de l’evolució de la població de Catalunya desde 1857 fins a l’actualidad. Les dades de població estan disponibles a l’Idescat: https://www.idescat.cat/indicadors/?id=aec&n=15223
Millora l’estètica del gràfic en la mesura del possible. Pots intentar fer el gràfic interactiu (que apareguin les dades en pasar el ratolí sobre la línia) i, fins i tot, animat. També pots intentar incorporar més línies al gràfic corresponents, per exemple, a la població de cada província.
Elabora amb ggplot2
un mapa amb 12-15 punts geogràfics.
Els punts poden fer referència a qualsevol cosa que t’interessi (llocs
que has visitat, restaurants recomanats, estadis de futbol, etc.).
Intenta millorar l’estètica del mapa tant com sigui possible.
Intenta replicar amb R el següent mapa amb les xifres d’assistència al cinema per comunitats autònomes l’any 2019. No cal fer servir la mateixa estètica, sinó que el mapa contingui la informació sobre l’assistència al cinema per comunitats autònomes.
Els 106.000 espectadors de Ceuta i Melilla els podeu repartir entre les dues ciutats (53.000 espectadors a cada ciutat, per exemple).
Font: https://bit.ly/3td73H4, p. 18