Introducción: en esta sección estudiaremos acerca del paquete ggplot2, que a entender de expertos es el marco gráfico más elegante y estéticamente más agradble disponible en R.
Lo que caracteriza a ggplot es que para crear gráficos, debemos realizar la configuración a través de la adición de capas, donde cada capa representa una caracterísitica del gráfico.
El proceso de creación de cualquier gráfico en ggplot es el siguiente:
1.1- Datos: El elemento más importante para realizar un gráfico es el conjunto de datos que se quieren representar. Una particularidad de ggplot2 es que solo acepta un tipo de datos: data.frames. Otras funciones gráficas (p.e., hist) admiten vectores, listas u otro tipo de estructuras. ggplot2 no.
library(ggplot2)
ggplot(iris)
Importante: antes de ejecutar nuestro código R, debemos tener cargada la librería ggplot2, de los contrario no se ejecutará el código.
1.2.- Estética: en un gráfico realizado con esta herramienta existe lo que se conoce como estéticas. Estéticas es, por ejemplo, el color, la distancia horizontal o vertical, la forma de un punto, el tamaño o el grosor de una línea o punto.
Siguiendo con nuestro data set iris, podemos agregarle la siguiente estética:
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, colour = Species))
El argumento aes() es sinónimo de estética, ggplot2 considera que el eje X e Y de la gráfica es estético, junto con el color, el tamaño, la forma, el relleno, etc. Se puede agregar cualquier estética que se desee dentro del argumento aes(), como por ejemplo indicar los ejes X e Y, especificando las variables respectivas del conjunto de datos. La variable en función de la cual el color, tamaño, forma y trazo debe cambiar también se puede especificar aquí mismo. Debes tener en cuenta que la estética especificada aquí será heredada por todas las capas geom que se agregarán posteriormente.
En este caso se etá añadiendo información sobre las variables utilizadas y el color que tomarán los datos en nuestro gráfico:
Algunas características estéticas en los gráficos de ggplot son la siguientes:
x e y, distancias horizontal y vertical.
color, para el color.
size, para el tamaño.
shape, que indica la forma de los puntos (cuadrados, triángulos, etc.) de los puntos o del trazo (continuo, punteado) de las líneas.
alpha para la transparencia: los valores más altos tendrían formas opacas y los más bajos, casi transparentes. De ahí la utilizad del canal alfa: da peso e importancia a las observaciones que la merecen.
fill, para el color de relleno de las formas sólidas (barras, etc.).
1.3.- Capas: Las capas (o geoms para ggplot2) son los verbos del lenguaje de los gráficos. Indican qué hacer con los datos y las estéticas elegidas, cómo representarlos en un lienzo. Veamos como el siguiente código crea el correspondiente gráfico.
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, colour = Species)) +
geom_point()
Una característica de las capas es que ellas se superponen, de allí su nombre, por ejemplo, si queremos sumar una nueva capa al gráfico anterior, por ejemplo una capa geom_smooth()
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, colour = Species)) +
geom_point() +
geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
añade al gráfico una curva de tendencia (con sus intervalos de confianza en gris).
De igual manera podemos cambiar las etiquetas del gráfico y el título por medio de las las capas xlab, ylab y ggtitle de la forma siguiente:
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, colour = Species)) +
geom_point()+
xlab("Longitud del Pétalo")+
ylab("Ancho del Pétalo")+
ggtitle("Diagrama de Dispersión")
Existen otros tipos de capas. Los más usuales son:
1.4.- Temas:Los temas de ggplot2 permiten modificar aspectos estéticos del gráfico que no tienen que ver con los datos en sí. Eso incluye los ejes, etiquetas, colores de fondo, el tamaño de los márgenes, etc.
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, colour = Species)) +
geom_point()+
xlab("Longitud del Pétalo")+
ylab("Ancho del Pétalo")+
ggtitle("Diagrama de Dispersión")+
theme(plot.title=element_text(size=20, face="bold"),
axis.text.x=element_text(size=10),
axis.text.y=element_text(size=10),
axis.title.x=element_text(size=14),
axis.title.y=element_text(size=14))
2.1.- Cómo hacer un diagrama de dispersión simple.
Hagamos un diagrama de dispersión usando la capa geom_point y con el conjunto de datos del medio oeste.
ggplot(midwest, aes(x=area, y=poptotal))+
geom_point()
Obtuvimos una gráfica de dispersión básica, donde cada punto representa un condado. Sin embargo, carece de algunos componentes básicos como el título, etiquetas de eje que indiquen que estamos midiendo, etc. Además, la mayoría de los puntos se concentran en la parte inferior del gráfico, lo que no es tan agradable y lo hace poco entendible. Sin embargo, veamos como solucionar este problema.
Para ello empecemos agregando una capa de suavizado usando geom_smooth(method=‘lm’). Dado que methodse establece como lm(abreviatura de modelo lineal ), dibuja la línea de mejor ajuste.
ggplot(midwest, aes(x=area, y=poptotal))+
geom_point()+
geom_smooth(method='lm')
## `geom_smooth()` using formula 'y ~ x'
La línea de mejor ajuste es azul. (Usamos el método lm, pudiendo haber usado otro, tal com glm, gam, looes, rlm.) Es posible que haya notado que la mayoría de los puntos se encuentran en la parte inferior del gráfico, lo que realmente no se ve bien. Entonces, cambiemos los límites del eje Y para enfocarnos en la mitad inferior.
2.2.- Ajuste de los límites de los ejes X e Y.
Los límites de los ejes X e Y se pueden controlar de 2 formas:
Método 1: eliminando los puntos fuera de rango.
Esto cambiará las líneas de mejor ajuste o suavizará las líneas en comparación con los datos originales.
Esto se puede hacer mediante xlim()y ylim(). Puede pasar un vector numérico de longitud 2 (con valores máximo y mínimo) o solo los valores máximo y mínimo.
Guardemos el gráfico de dispersión realizado en un objeto, esto por comodidad de escritura de código, llamemos a este objeto g:
g<- ggplot(midwest, aes(x=area, y=poptotal))+
geom_point()+
geom_smooth(method='lm')
Eliminemos los puntos fuera de rango
g + xlim(c(0, 0.1)) + ylim(c(0, 1000000))
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 5 rows containing non-finite values (stat_smooth).
## Warning: Removed 5 rows containing missing values (geom_point).
En este caso, el gráfico no se creó desde cero, sino que se construyó sobre g. Esto se debe a que el gráfico anterior se almacenó como g (un objeto ggplot), que cuando se llama reproducirá el gráfico original. Usando ggplot, puede agregar más capas, temas y otras configuraciones en la parte superior de este gráfico.
Notese que la línea de mejor ajuste se volvió más horizontal en comparación con la trama original. Esto se debe a que, al usar xlim()y ylim(), los puntos fuera del rango especificado se eliminan y no se considerarán al dibujar la línea de mejor ajuste (uso geom_smooth(method=‘lm’)). Esta función puede resultar útil cuando desee saber cómo cambiaría la línea de mejor ajuste cuando se eliminen algunos valores extremos (o valores atípicos).
Método 1:Acercar:
Este método consiste en cambiar los límites de los ejes X e Y haciendo zoom en la región de interés sin eliminar los puntos. Esto se hace usando coord_cartesian().
g + coord_cartesian(xlim=c(0,0.1), ylim=c(0, 1000000))
## `geom_smooth()` using formula 'y ~ x'
2.3.- Cómo cambiar las etiquetas de título y eje
Almacenemos el gráfico hecho hasta ahora en un objeto que llamaremos g1:
g1 <- g + xlim(c(0, 0.1)) + ylim(c(0, 1000000))
Agreguemos el título y las etiquetas para los ejes x e y. Esto se puede hacer de una sola vez utiliando la función labs() con title, donde x e y son los argumentos. Otra forma es utilizar ggtitle(), xlab() y ylab()
# Agregar título y etiquetas
g1 + labs(title="Area Vs Population", subtitle="From midwest dataset", y="Population", x="Area", caption="Midwest Demographics")
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 5 rows containing non-finite values (stat_smooth).
## Warning: Removed 5 rows containing missing values (geom_point).
Usando ggtitle:
g1 + ggtitle("Area Vs Population", subtitle="From midwest dataset") + xlab("Area") + ylab("Population")
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 5 rows containing non-finite values (stat_smooth).
## Warning: Removed 5 rows containing missing values (geom_point).
2.4.- Cambiar el color y el tamaño de los puntos
Podemos cambiar la estética de una capa geom modificando las respectivas geom. Cambiemos el color de los puntos y la línea a un valor estático en la capa geom_point.
ggplot(midwest, aes(x=area, y=poptotal)) +
# Establecer color y tamaño estáticos para puntos
geom_point(col="steelblue", size=3) +
# cambio en el color de la línea
geom_smooth(method="lm", col="firebrick") +
coord_cartesian(xlim=c(0, 0.1), ylim=c(0, 1000000)) +
labs(title="Area Vs Population", subtitle="From midwest dataset", y="Population", x="Area", caption="Midwest Demographics")
## `geom_smooth()` using formula 'y ~ x'
2.4.- Cambiar el color para reflejar las categorías en función a otra columna:
Hemos almacenamos nuestro gráfico en un objeto llamado gg
gg <- ggplot(midwest, aes(x=area, y=poptotal)) +
# Establecer el color para que varíe según las categorías estatales.
geom_point(aes(col=state), size=3) +
# Establecer el color para que varíe según las categorías estatales.
geom_smooth(method="lm", col="firebrick", size=2) +
coord_cartesian(xlim=c(0, 0.1), ylim=c(0, 1000000)) +
labs(title="Area Vs Population", subtitle="From midwest dataset", y="Population", x="Area", caption="Midwest Demographics")
plot(gg)
## `geom_smooth()` using formula 'y ~ x'
Ahora cada punto está coloreado según el nombre al stateque pertenece aes(col=state). No solo color, pero size, shape, stroke(espesor de frontera) y fill(color de relleno) se pueden utilizar para discriminar agrupaciones.
Como beneficio adicional, la leyenda se agrega automáticamente. Si es necesario, se puede eliminar configurando legend.positiona Nonedesde dentro de una theme()función.
# Eliminamos la leyenda
gg + theme(legend.position="None")
## `geom_smooth()` using formula 'y ~ x'
Ahora cambiemo la paleta de colores
# cambiar paleta de colores
gg + scale_colour_brewer(palette = "Set1")
## `geom_smooth()` using formula 'y ~ x'
2.5.- Personalizar todo el tema de una sola vez usando temas prediseñados
Finalmente, en lugar de cambiar los componentes del tema individualmente, podemos cambiar todo el tema usando temas prediseñados.
De nuevo, esto se hace comúnmente de dos maneras. * Utilice theme_set () para configurar el tema antes de dibujar el ggplot. Tenga en cuenta que esta configuración afectará a todos los gráficos futuros. * Dibuje el ggplot y luego agregue la configuración general del tema (por ejemplo theme_bw())
# Gráfico Base, llamado gg
gg <- ggplot(midwest, aes(x=area, y=poptotal)) +
geom_point(aes(col=state), size=3) + # Set color to vary based on state categories.
geom_smooth(method="lm", col="firebrick", size=2) +
coord_cartesian(xlim=c(0, 0.1), ylim=c(0, 1000000)) +
labs(title="Area Vs Population", subtitle="From midwest dataset", y="Population", x="Area", caption="Midwest Demographics")
gg <- gg + scale_x_continuous(breaks=seq(0, 0.1, 0.01))
Método 1: Usando theme_set()
theme_set(theme_classic())
plot(gg)
## `geom_smooth()` using formula 'y ~ x'
Método 2: Agregando la capa itself
gg + theme_bw() + labs(subtitle="BW Theme")
## `geom_smooth()` using formula 'y ~ x'
gg + theme_classic() + labs(subtitle="Classic Theme")
## `geom_smooth()` using formula 'y ~ x'
2.5.- Como eliminar la cuadrícula principal y secundaria, cambiar el borde, el título del eje, el texto y las marcas
# Gráfico Base
g <- ggplot(mpg, aes(x=displ, y=hwy)) +
geom_point() +
geom_smooth(method="lm", se=FALSE) +
theme_bw() # apply bw theme
g + theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.border = element_blank(),
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank()) +
labs(title="Fondo Modificado", subtitle="Cómo eliminar la cuadrícula del eje mayor y menor, el borde, el título del eje, el texto y las marcas")
## `geom_smooth()` using formula 'y ~ x'
Para otras modificaciones, visitar: [http://r-statistics.co/Complete-Ggplot2-Tutorial-Part2-Customizing-Theme-With-R-Code.html]
<h4< Para ver otras modificaciones como: