2018-08-30

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 1.4.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos los gráficos de la figura 1.4. Se trata de dos diagramas de dispersión del conjunto de datos NCI-60 y cada observación representa una de las 64 líneas celulares (cell lines) correspondientes a un tipo de cáncer. A la izquierda, representados dos vectores de análisis de componentes principales. Parece haber 4 grupos de observaciones que separamos por colores. A la derecha, el mismo gráfico de la izquierda pero representados cada tipo de cáncer con un color y símbolo diferente. Las observaciones que corresponden al mismo tipo de cáncer tienden a estar cerca en este espacio bidimensional.

Solución con ggplot2

# Librerías y datos NCI60 
library(ISLR)
library(tidyverse)
nci.labs <- NCI60$labs
nci.data <- NCI60$data

# Análisis de componentes principales (ACP o PCA) con NCI60 
pr.out <- prcomp(nci.data, scale=TRUE)

# Gráfico 1
df1 <- data.frame(pr.out$x[, 1:2], nci.labs) %>% 
  mutate(groups =ifelse(
  PC1 < -40, 'group1', ifelse(
  PC1 > -42 & PC2 > 1, 'group2', ifelse(
  PC1 > 25 & PC2 < 1, 'group3', 'group4'))))
p1 <- ggplot(df1, aes(x = PC1, y = PC2, colour = groups)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2")+
  scale_color_manual(values = c("group1" = "red", "group2" = "blue", "group3" = "green4", "group4" = "cyan4" ))+
  theme_bw()+
  theme(legend.position="none")

# Gráfico 2
df2 <- data.frame(pr.out$x[, 1:2], nci.labs)
p2 <- ggplot(df2, aes(x = PC1, y = PC2, colour = nci.labs)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2")+
  theme_bw()+
  theme(legend.position="none")

# Gráficos lado a lado: dos alternativas
library(gridExtra)
grid.arrange(p1, p2, ncol = 2)

library(cowplot)
plot_grid(p1, p2, labels = "AUTO")

# Con leyenda modificando su título
ggplot(df2, aes(x = PC1, y = PC2, colour = nci.labs)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2", colour = "Types of cancer")+
  theme_bw()

Gráficos con ggplot2

Alternativa con el paquete Graphics

Con el paquete graghics de la configuración base de R.

# Asigno colores manualmente para el primer gráfico
df3 <- data.frame(pr.out$x[, 1:2], nci.labs) %>% 
  mutate(groups =ifelse(
  PC1 < -40, 'red', ifelse(
  PC1 > -42 & PC2 > 1, 'blue', ifelse(
  PC1 > 25 & PC2 < 1, 'green4', 'cyan4'))))

# Función para asignar colores del segundo gráfico
Cols <- function(vec){
  cols=rainbow(length(unique(vec)))
  return(cols[as.numeric(as.factor(vec))])
}
# Gráficos
par(mfrow = c(1,2))
plot(df1[, 1:2], col = df3$groups, pch = 19, xlab = "Z1", ylab = "Z3")
plot(df1[, 1:2], col = Cols(nci.labs), pch = 19, xlab = "Z1", ylab = "Z2")

Entradas relacionadas

No hay comentarios:

Publicar un comentario

Nube de datos