Visualización de datos

Felipe S. M. Barros
30/10/2018

Trabajando con graficos

Temario

  • graficos basicos
  • ggplot2

Cargando datos

mpg <- read.csv("mpg.csv")
head(mpg)
  manufacturer model displ year cyl      trans drv cty hwy fl   class
1         audi    a4   1.8 1999   4   auto(l5)   f  18  29  p compact
2         audi    a4   1.8 1999   4 manual(m5)   f  21  29  p compact
3         audi    a4   2.0 2008   4 manual(m6)   f  20  31  p compact
4         audi    a4   2.0 2008   4   auto(av)   f  21  30  p compact
5         audi    a4   2.8 1999   6   auto(l5)   f  16  26  p compact
6         audi    a4   2.8 1999   6 manual(m5)   f  18  26  p compact

De que se tratan?

# manufacturer
# model
# displ = engine displacement, in litres (size)
# year = year of manufacture
# cyl = number of cylinders
# trans = type of transmission
# drv = f = front-wheel drive, r = rear wheel drive, 4 = 4wd
# cty = city miles per gallon
# hwy = highway miles per gallon
# fl = fuel type
# class = "type" of car

Pregunta:

Los autos con motor mas chico son mas economicos?

Como podríamos ver eso con un grafico de disperción

plot(mpg$displ, mpg$hwy)

plot of chunk unnamed-chunk-3

Vamos mejorar nuestro gráfico?

vamos ocupar una librería llamada ggplot; que permite crear gráficos de forma mas intutiva y con mejor estetica

# install.packages('ggplot2')
library(ggplot2)

Como se usar el ggplot?

El ggplot trabaja con capas. La primera que creamos es las base del grafico, adonde informamos que datos serán usados (en ese caso mpg).
A esa base se agregan (por eso el +) informaciones como la geometria a ser usada y la estetica (aparencia)

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy))

plot of chunk unnamed-chunk-5

Como cambiar la estetica (color por clase)?

Ua vez que tenemos definido la geometrias (dispersión = geom_point()), podemos agregar otras variables para mejorar el grafico. Por ejemplo, hacer con que cambie el color de los puntos acuerdo a las clases de auto.

ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy, colour = class))

plot of chunk unnamed-chunk-6

Como cambiar la estetica (formato por clase) ?

Así como ocupamos el parametro estético colour, como te crees que podemos cambiar el formato de los puntos?

Como cambiar la estetica (color) ?

Que resultado tendrán los comandos abajo?

ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy) , colour = "red")


ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy) , shape = 6)

Ejercícios I

Que te parece que vá apresentar el codigo abajo?

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = "blue"))

plot of chunk unnamed-chunk-8

# que ha de equivocado en ese comando?

Ejercícios II

Que te parece que vá apresentar el codigo abajo?

# Que pasa al ocupar una variable continua al color?
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = cty))

# y en el tamaño?

# y en formato?

# Como la estetica cambia en relación a variables categoricas / continuas?

Una misma variable para distintos elementos esteticos

Se puede ocupar una misma variable en distintos elementos esteticos, como en lo ejemplo abajo.
Como queda el grafico?

# Mapeando la misma variable en distintos elementos esteticos
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, size = cty, color = cty))

Estetica en relacion logica

Se puede definir distintos colores en relación a una operación lógica.

Como quedan los gráficos?

# Se puede trabajar con condicionales (logicos)
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, colour = displ < 5))
# Y se hago eso:
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, colour = displ < 5 | hwy < 20))

Dividindo en distintos graficos

ggplotnos permite dividir de forma facilitada un grafico en función de una variable categorica, usando la función facet_warp()

# El primero argumento de facet_earp debe ser la formula en la cual se debe dividir los graficos
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) +
  facet_wrap(~class)

Dividindo los gráficos acuerdo a dos variables

Para hacer la división en relación a dos variables categoricas, debemos usar facet_grid

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) +
  facet_grid(drv ~ cyl)

Ejercicio I:

  • Y si ocupamos una variable contínua en facet_warp? Tiene sentido?
  • Cuales son las ventajas de usar facet?
  • Y las desventajas?

Otros tipos de gráficos

Para hacermos otros graficos mas allá de los graficos de dispersión, vamos ocupar las otras formas de geometría (geom_*) de ggplot:

Por ejemplo: geom_smooth (suavizador)

ggplot(data = mpg) + 
  geom_smooth(mapping = aes(x = displ, y = hwy))

Parametros esteticos

Muchas veces los parametros esteticos (que figuran en aes() ), son los mismos. Pero no siempre

Con smooth no se puede usar shape, pero si se puede usar linetype

Como quedará este grafico?

ggplot(data = mpg) + 
  geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))

Graficos con más de una geometría:

Como estamos trabajando con capas del grafico, podemos agregar distintas geometrias. Como crees que podríamos hacer eso?
Ejemplo:

  • Como se podría agregar al grafico de dispersión el grafico de suavización?

Graficos con más de una geometría II:

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) + 
  geom_smooth(mapping = aes(x = displ, y = hwy))

plot of chunk unnamed-chunk-17

Gráficos con más de una geometría III:

Perciba que estamos repetindo algunos elementos esteticos;
Que pasa si hacemos eso?

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point() + 
  geom_smooth()

plot of chunk unnamed-chunk-18

# cuales serían los beneficios de eso?

Gráficos con más de una geometría IV:

Y si queremos que los puntos estén relacionados a la clase de auto? Atención: Solo los puntos!
** como quedaría el codigo para hacer ese grafico?**

plot of chunk unnamed-chunk-19

Ejercícios:

Que grafico producirá el codigo abajo? Hay algo de nuevo en él? De que se trata?

ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv)) + 
  geom_point() + 
  geom_smooth(se = FALSE)

Ejercícios II:

Estos codigos producirán distintos graficos?

ggplot() + 
  geom_point(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_smooth(data = mpg, mapping = aes(x = displ, y = hwy))

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + 
  geom_point(aes(colour = class)) + 
  geom_smooth()

Ejercícios III:

Como harías estos gráficos?

Ejercícios IV:

Que otras geometrías vos ocuparías para hacer:

  • un boxplot?
  • un histogram?
  • un grafico de barras?

barplot

Los graficos de barra son muy interesantes pués presentan un cambio en los datos, una vez que la información count no existe en la tabla.
Los graficos de barras, histogramas ajustan sus datos antes de hacer el grafico. Tal cual hace la geometria smooth, que ajusta una regresión, y los graficso de caja boxplots.

ggplot(data = mpg) + 
  geom_bar(mapping = aes(x = class))

plot of chunk unnamed-chunk-23

Función `stat`

Los graficos de barras, histogramas ajustan sus datos antes de hacer el grafico. Tal cual hace la geometria smooth, que ajusta una regresión, y los grafico de caja boxplots.

barplot parametros esteticos

Que resultado tendrán los seguientes condigos?

ggplot(data = mpg) + 
  geom_bar(mapping = aes(x = class, colour = class))

ggplot(data = mpg) + 
  geom_bar(mapping = aes(x = class, fill = class))

Barplot con mas de dos variables

Que pasa si creamos un grafico de barra basado en las clases de autos pero el color en función del tipo de motor (delantero, trasero o cuatro rodas)?

ggplot(data = mpg) + 
  geom_bar(mapping = aes(x = class, fill = drv))

El parametro position = "fill"

Permite que se compare de forma mas eficiente las proporciones:

ggplot(data = mpg) + 
  geom_bar(mapping = aes(x = class, fill = drv), position = "fill")

Las coodernadas

Hay un argumento más que resulta ser interesante: Con ggplot que facil cambiar la orientación de los graficos, usando la función coord_flip().
En base al grafico abajo:

  • Que efecto tendría si cambiamos la orientación del grafico?
  • Como hariamos lo haríamos?
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) + 
  geom_boxplot()

plot of chunk unnamed-chunk-27

Grafico Polar

La función coord_polar() ocupa el sistema de simbolos en formato polar, y suele ser util a algunos casos.

ggplot(data = mpg)+
  geom_bar(mapping = aes(x = class, fill = class)) + coord_polar()

plot of chunk unnamed-chunk-28

Grafico Polar II

Como quedaría si ponemos el color en función a otras variables categorica?

ggplot(data = mpg)+
  geom_bar(mapping = aes(x = class, fill = drv)) + coord_polar()

Grafico Polar II

Y si ocupamos el parametro position = "fill"?

ggplot(data = mpg)+
  geom_bar(mapping = aes(x = class, fill = drv), position = 'fill') + coord_polar()

RESUMEN

De forma general, vimos que ggplot tiene una sintaxis específica para elborar los graficos. Podemos resumir de esta forma:

ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>(
     mapping = aes(<MAPPINGS>),
     stat = <STAT>, 
     position = <POSITION>
  ) +
  <COORDINATE_FUNCTION> +
  <FACET_FUNCTION>

Guardando el grafico

ggsave("Mi_grafico_copado.png")
ggsave("Mi_grafico_copado.pdf")

Datos diamantes

Que graficos podrías hacer con los datos de diamantes?

diamonds <- read.csv('./Diamonds.csv')
head(diamonds)
  carat       cut color clarity depth table price    x    y    z
1  0.23     Ideal     E     SI2  61.5    55   326 3.95 3.98 2.43
2  0.21   Premium     E     SI1  59.8    61   326 3.89 3.84 2.31
3  0.23      Good     E     VS1  56.9    65   327 4.05 4.07 2.31
4  0.29   Premium     I     VS2  62.4    58   334 4.20 4.23 2.63
5  0.31      Good     J     SI2  63.3    58   335 4.34 4.35 2.75
6  0.24 Very Good     J    VVS2  62.8    57   336 3.94 3.96 2.48

Propuestas

Que graficos podrías hacer con los datos de diamantes?

ggplot(data = diamonds) + 
  geom_point(mapping = aes(x = price, y = depth)) + 
  facet_wrap(~clarity)