1 El paquet 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

1.1 Diagrames de dispersió

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)

1.2 Gràfics de columnes i de barres

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()

1.3 Histogrames

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`.

1.4 Diagrames de caixes

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()

1.5 Mapes de calor

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")

1.6 Gràfics de línies

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

2 Gràfics interactius

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

3 Gràfics animats

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

4 Mapes

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"))

4.1 Situar punts en un mapa

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)

4.2 Mapa de comunitats autònomes

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()

4.3 Mapa con OpenStreetMap

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!")

4.4 Mapa dels Estats Units

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

5 Exercici 3

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.

5.1 Primera part: gràfics

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.

5.2 Segona part: gràfic de l’evolució de la població de Catalunya

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.

5.3 Tercera part: ubicacions a un mapa

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.

5.4 Quarta part (opcional): mapa de comunitats autònomes

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

Font: https://bit.ly/3td73H4, p. 18