# comentario
# carga de librerias principales
library(tidyverse)
library(plotly)
library(data.table)
library(ggplot2)

ggplot2 es la librería más popular de R, diseñada para una calidad de impresión en forma sencilla y con alto grado de personalización.

La principal librería para gráficos en R es ggplot2 que conforma un paqute orientado a la visualización de datos. Mejora notoriamente los gráficos y estética por sobre los generados en forma normal por R.

ggplot2 crea los gráficos en base a una serie de capas tipo geom_ para determinar el tipo a crear y elementos de estética que definen su aspecto particular.

geom_bin geom_boxplot geom_density geom_error geom_hex geom_hist geom_hline geom_jitter geom_label geom_line geom_point geom_polygon geom_rect geom_ribbon geom_rug geom_segment geom_smooth geom_text geom_tile geom_violin

Aprende a identificar los gráficos según los datos en data to viz

Elementos

Creación de un gráfico:

  • Siempre empieza llamando a la función ggplot().

  • Luego especifica el objeto de datos. Tiene que ser un marco de datos (dataframe). Y necesita una variable numérica y otra categórica.

  • luego viene la estética, establecida en la función aes(): establecer la variable categórica para el eje X, usar la numérica para el eje Y.

  • finalmente llamar a geom_bar(). Hay que especificar stat=“identity” para este tipo de conjunto de datos.

Gramática

Data: el conjunto de datos

Layers:

Scales:

Coordinates

Faceting:

Themes:

Components principales

Data: datos utilizados para la visualización.

Aesthetics: mapeo de datos en los ejes.

Layers: capa de gráfico dada por la función geom_ que especifica el tipo de gráfico a crear.

Datos

Datos de ejemplo con el conjunto de datos de titanic (1309 registros, 14 variables).

# carga del archivo en una variable llamada "dataset". Coloque este archivo en la misma carpeta de este documento.
dataset <- read.csv("data/titanic3.csv")
# transforma el dataset en un dataframe
dataset <- data.frame(dataset)
# mostrar la estructura del dataset
str(dataset)
## 'data.frame':    1309 obs. of  14 variables:
##  $ pclass   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ survived : int  1 1 0 0 0 1 1 0 1 0 ...
##  $ name     : chr  "Allen, Miss. Elisabeth Walton" "Allison, Master. Hudson Trevor" "Allison, Miss. Helen Loraine" "Allison, Mr. Hudson Joshua Creighton" ...
##  $ sex      : chr  "female" "male" "female" "male" ...
##  $ age      : num  29 0.917 2 30 25 ...
##  $ sibsp    : int  0 1 1 1 1 0 1 0 2 0 ...
##  $ parch    : int  0 2 2 2 2 0 0 0 0 0 ...
##  $ ticket   : chr  "24160" "113781" "113781" "113781" ...
##  $ fare     : num  211 152 152 152 152 ...
##  $ cabin    : chr  "B5" "C22 C26" "C22 C26" "C22 C26" ...
##  $ embarked : chr  "S" "S" "S" "S" ...
##  $ boat     : chr  "2" "11" "" "" ...
##  $ body     : int  NA NA NA 135 NA NA NA NA NA 22 ...
##  $ home.dest: chr  "St Louis, MO" "Montreal, PQ / Chesterville, ON" "Montreal, PQ / Chesterville, ON" "Montreal, PQ / Chesterville, ON" ...
# diamantes
diamantes <- read.csv("data/diamonds.csv")
diamantes %>%
  keep(is.numeric) %>%
  gather() %>%
  ggplot() +
  geom_histogram(mapping = aes(x=value,fill=key), color="black") +
  theme(plot.title = element_text(size=12, # tamaño
                              hjust = 0.5, # centrado
                              face="bold", # estilo
                              color = "black") # color
      ) +
  facet_wrap(~ key, scales = "free") +
  xlab("") +
  ggtitle("Distribución de variables")

#complete.cases(dataset) # TRUE indicates a complete row; FALSE indicates a row with at least
# one incomplete column
p <- sum(complete.cases(dataset))
p
## [1] 119
# sacamos columnas
nuevo <- select(dataset, -c(ticket, cabin, boat, body, home.dest))
str(nuevo)
## 'data.frame':    1309 obs. of  9 variables:
##  $ pclass  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ survived: int  1 1 0 0 0 1 1 0 1 0 ...
##  $ name    : chr  "Allen, Miss. Elisabeth Walton" "Allison, Master. Hudson Trevor" "Allison, Miss. Helen Loraine" "Allison, Mr. Hudson Joshua Creighton" ...
##  $ sex     : chr  "female" "male" "female" "male" ...
##  $ age     : num  29 0.917 2 30 25 ...
##  $ sibsp   : int  0 1 1 1 1 0 1 0 2 0 ...
##  $ parch   : int  0 2 2 2 2 0 0 0 0 0 ...
##  $ fare    : num  211 152 152 152 152 ...
##  $ embarked: chr  "S" "S" "S" "S" ...
# transformamos algunas columnas a factores, valores discretos.
titanic <- dataset %>% 
    mutate(survived=ifelse(survived==1,"Survived","Dead")) %>% 
    mutate(survived = as.factor(survived),
      pclass=as.factor(pclass),
      sex=as.factor(sex),
      embarked=as.factor(embarked)
    )

Gráficos

El gráfico más simple.

ggplot(titanic, aes(x = survived)) + geom_bar()

Incorporación de etiquetas.

ggplot(titanic, aes(x = survived)) + 
  theme_bw() +
  geom_bar() +
  labs(y = "Pasajeros", title = "Supervivencia en Titanic")

Agrupada.

ggplot(titanic, aes(x = sex, fill = survived)) + 
  theme_bw() +
  geom_bar() +
  labs(y = "Pasajeros", title = "Supervivencia en Titanic por Género")

ggplot(titanic, aes(x = pclass, fill = survived)) + 
  theme_bw() +
  geom_bar() +
  #geom_text(aes(label=survived), vjust=1.6, color="black", size=3.5) +
  labs(y = "Pasajeros", title = "Supervivencia en Titanic por Clase")

Agregado por grupos.

ggplot(titanic, aes(x = sex, fill = survived)) + 
  theme_bw() +
  facet_wrap(~ pclass) +
  geom_bar() +
  labs(y = "Pasajeros", title = "Supervivencia en Titanic por Clase y Género")

Barplot

Un gráfico de barras se utiliza para mostrar la relación entre una variable numérica y una categórica.

library(ggthemes)
# gráfico de barra
ggplot(titanic, aes(x=sex, fill=survived)) + 
  geom_bar(position = "fill") + 
  ggthemes::theme_economist() + 
  scale_color_gdocs() + 
  ggthemes::scale_fill_gdocs()

Boxplot

Un boxplot muestra la distribución de datos de una variable continua.

Distribución de Edades

ggplot(titanic, aes(x=sex, y=age, fill=sex)) + 
  geom_boxplot() +
  theme(
    legend.position="right", # posición del cuadro de leyenda
    # "none" lo oculta
    plot.title = element_text(size=12, # tamaño
                              hjust = 0.5, # centrado
                              face="bold", # estilo
                              color = "black") # color
    ) +
  xlab("Sexo") +
  ylab("Edad") +
  ggtitle("Distribución de edades por sexo")

ggplot(titanic, aes(x=sex, y=age, fill=sex)) + 
  geom_boxplot() +
  geom_jitter(color="black", size=0.6, alpha=0.9) + # muestra los puntos
  theme(
    legend.position="none",
    plot.title = element_text(size=11, # tamaño
                              hjust = 0.5, # centrado
                              face="bold", # estilo
                              color = "black")
  ) +
  ggtitle("Distribución de edades por sexo")

Distribución de edades por clase

g1 <- titanic %>%
  ggplot(aes(x=pclass, y=age, fill=pclass)) + 
    geom_boxplot() +
    theme(
      legend.position="none",
      plot.title = element_text(size=10, # tamaño
                                hjust = 0.5, # centrado
                                face="bold", # estilo
                                color = "black")
  ) +
  xlab("Clase Pasajero") +
  ylab("Edad") +
  ggtitle("Distribución de edades por clase")

g1

Violin

Permite visualizar la distribución de variables numéricas para uno o mas grupos. Sobre todo para grandes set de datos. Compara la densidad entre grupos.

g2 <- titanic %>%
  ggplot(aes(x=pclass, y=age, fill=pclass)) + 
    geom_violin() +
    theme(
      legend.position="none",
      plot.title = element_text(size=10, # tamaño
                                hjust = 0.5, # centrado
                                face="bold", # estilo
                                color = "black")
  ) +
  labs( x="Clase", y="Edad", 
        title="Distribución de edades por clase")

g2

# agregamos boxplot
g2 + geom_boxplot(width = 0.3)

Histograma

Un histograma es una representación gráfica precisa de la distribución de una variable numérica. Sólo toma como entrada variables numéricas. La variable se divide en varios intervalos, y el número de observaciones por intervalo se representa mediante la altura de la barra.

Se usa para analizar una o pocas variables, siempre numéricas.

g3 <- titanic %>%
  ggplot( aes(x=age)) +
  geom_histogram( binwidth=3, fill="#69b3a2", color="#e9ecef", alpha=0.9) +
  theme(
    plot.title = element_text(size=10, # tamaño
                                hjust = 0.5, # centrado
                                face="bold", # estilo
                                color = "black")
  ) +
  labs(x = "Edad", y = "Cuenta", title = "Distribución de edad")

g3

g5 <- titanic %>%
  ggplot( aes(x = age, fill = survived)) +
    theme_bw() +
  geom_histogram(binwidth = 5) +
  labs(y = "Pasajeros", x ="Edad", title = "Sobrevivencia por edad")

g5

Una variable numéricas por grupo.

library(hrbrthemes)
p <- titanic %>%
    ggplot( aes(x=age, fill=pclass, color=pclass)) +
    geom_histogram( color="#e9ecef", alpha=0.6, position = 'identity') +
   # scale_fill_manual(values=c("#69b3a2", "#404080")) +
    ggthemes::theme_economist() +
    labs(fill="")
p

Densidad

ggplot(titanic, aes(x = age, fill = survived)) +
  theme_bw() +
  facet_wrap(sex ~ pclass) +
  geom_density(alpha = 0.5) +
  labs(y = "Edad", x = "Sobrevivencia",
       title = "Sobrevida por edad, clase y sexo")

Dispersion

data(mtcars)
# grafico simple
ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point()+ggtitle("Titulo") +
    theme(plot.title = element_text(hjust=0.5,face="bold", color = "red"))

ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes(size=qsec))

ggplot(mtcars, aes(x=wt, y=mpg)) + 
  geom_point() +  
  geom_text(label=rownames(mtcars), size=2.5)

Time serie

Las series temporales tienen por objeto estudiar la evolución de una o varias variables a lo largo del tiempo. Esta sección da ejemplos usando R. Se hace un enfoque en “tidyverse”: el paquete de “lubridate” es de hecho su mejor amigo para tratar con el formato de fecha, y “ggplot2” permite trazarlo eficientemente. El paquete de “dygraphs” también se considera para construir gráficos interactivos impresionantes.

# Dummy data
data <- data.frame(
  day = as.Date("2017-06-14") - 0:364,
  value = runif(365) + seq(-140, 224)^2 / 10000
)
# Most basic bubble plot
p <- ggplot(data, aes(x=day, y=value)) +
  geom_line() + 
  xlab("")
p

# Dummy data
data <- data.frame(
  day = as.Date("2017-06-14") - 0:364,
  value = runif(365) + seq(-140, 224)^2 / 10000
)
# Most basic bubble plot
p <- ggplot(data, aes(x=day, y=value)) +
  geom_line( color="steelblue") + 
  geom_point() +
  xlab("") +
  theme(axis.text.x=element_text(angle=60, hjust=1)) +
  scale_x_date(limit=c(as.Date("2017-01-01"),as.Date("2017-02-11"))) +
  ylim(0,1.5)
p

# Load dataset from github
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv", header=T)
data$date <- as.Date(data$date)
# plot
g <- data %>% 
  ggplot( aes(x=date, y=value)) +
    geom_line(color="#69b3a2") +
    ylim(0,22000) +
    annotate(geom="text", x=as.Date("2017-01-01"), y=20089, 
             label="Bitcoin price reached 20k $\nat the end of 2017") +
    annotate(geom="point", x=as.Date("2017-12-17"), y=20089, size=10, shape=21, fill="transparent") +
    geom_hline(yintercept=5000, color="orange", size=.5)

g + plotly()

Unir gráficos

Hay muchas librerias para crear una grilla (grid) que permite gestionar la visualización de los gráficos de multiples maneras.

library(gridExtra)

# grafico 1
graf1 <- titanic %>%
  ggplot(aes(x=pclass, y=age, fill=pclass)) + 
    geom_violin() +
    theme(
      legend.position="none",
      plot.title = element_text(size=11, # tamaño
                                hjust = 0.5, # centrado
                                face="bold", # estilo
                                color = "black")
  ) +
  xlab("Clase") +
  ylab("Edad") +
  ggtitle("Edades")

# grafico 2
graf2 <- ggplot(titanic, aes(x=sex, y=age, fill=sex)) + 
  geom_boxplot() +
  geom_jitter(color="black", size=0.6, alpha=0.9) + # muestra los puntos
  theme(
    legend.position="none",
    plot.title = element_text(size=11, # tamaño
                              hjust = 0.5, # centrado
                              face="bold", # estilo
                              color = "black")
  ) +
  ggtitle("Edades")

# grafico 3
graf3 <- ggplot(titanic, aes(x=sex, y=age, fill=sex)) + 
  geom_boxplot() +
  theme(
    legend.position="right", # posición del cuadro de leyenda
    # "none" lo oculta
    plot.title = element_text(size=12, # tamaño
                              hjust = 0.5, # centrado
                              face="bold", # estilo
                              color = "black") # color
    ) +
  xlab("Sexo") +
  ylab("Edad") +
  ggtitle("Edades")

g4 <- graf3 + theme(legend.position = "none") # ocultar leyenda
# unir los graficos 1 y 2

grafico <- grid.arrange(graf1, graf2, g4,
                        ncol=2, nrow=2,
                        layout_matrix = rbind(c(1,1), c(2,3))
                        )

# union de graficos
grafico2 <- grid.arrange(g1, g2, g3, graf2,
                        ncol=3, nrow=2,
                        layout_matrix = rbind(c(1,2,3),c(4,4,4))
                        )