En este documento se presenta una introducción a la construcción de grÔficos en R, usando los grÔficos graphics propios de R y el paquete ggplot2.
En el proceso de minerĆa de datos la visualización de datos esta presente en varias de sus etapas entre las principales estĆ”n la exploración de los datos y la presentación de los resultados, los grĆ”ficos permiten, de forma intuitiva, encontrar y entender patrones, grupos o valores atipicos que puedan existir en los datos, una vez terminado el proceso de exploración o predicción los grĆ”ficos nos permiten comunicar los resultados a nuestra audiencia sin importar si esta tiene o no conocimientos en MinerĆa de Datos.
Ejemplo de como comunicar los resultados de un anƔlisis
Puedes descargar los datos utilizados para realizar estas grÔficas en la siguiente dirección : http://rnotr.com/assets/files/ab3.csv
Como podemos ver en el ejemplo anterior, el resultado de un anÔlisis exploratorio o predictivo puede ser presentado en un par de grÔficas si estas se realizan de forma correcta, aunque este tema se tocarÔ a profundidad en el curso de visualización de datos en esta semana se verÔn las pautas bÔsicas para la creación de grÔficos en R.
En R existen un gran cantidad de paquetes que nos permiten graficar datos entre los mĆ”s utilizados estĆ”n graphics el paquete nativo de R para la visualización de datos y ggplot2 un paquete desarrollado por Hadley Wickham basado en la teorĆa de la gramĆ”tica de los grĆ”ficos o grammar of graphics y un gran favorito de muchos a la hora de realizar grĆ”ficos en R.
Existe una gran cantidad de maneras de representar datos, cada una de ellas pensada para abordar un problema y tipo de dato en especĆfico, en este curso veremos como crear algunos de estos grĆ”ficos asĆ como su interpretación.
Este es uno de los métodos mÔs clÔsicos para representar la relación entre dos variables numéricas, este funciona utilizando el sistema de coordenadas cartesiano, para ejemplificar este tipo de grÔfico utilizaremos dos fuentes de datos ambas disponibles en R, la tabla de datos cars y la tabla de datos iris.
Inicialmente para crear un grÔfico de dispersión sólo es necesario indicarle a la función plot los valores para la coordenada de X y los valores para la coordenada Y.
plot(x = cars$dist, y = cars$speed) # tamaƱo de las etiquetas de los ejes.
Como podemos ver tenemos como resultado un grÔfico que aunque útil es poco informativo, por suerte el paquete graphics nos permite dar modificar muchas de las propiedades de nuestro grÔfico para facilitar su lectura e interpretación.
plot(x = cars$dist,
y = cars$speed,
# Titulo principal
main = "Relación entre la velocidad de un vehiculo y distancia requerida para el frenado",
xlab = "Velocidad (mph)", # etiqueta del eje x
ylab = "Distancia de frenado (millas)", # etiqueta del eje y
xlim = c(0,120), # rango del eje x
ylim = c(4,25),# rango del eje y
col = "red",# color del los formas del grƔfico
pch = 19, # tipo de forma dle grƔfico
cex.main = .95, # tamaƱo del titulo
cex.axis = .80, # tamaƱo de la escala
cex.lab = .80) # tamaƱo de las etiquetas de los ejes.
Existen una gran variedad de funciones que nos permiten agregar formas extra a nuestros grĆ”ficos, ya sean lĆneas, puntos, texto o polĆgonos.
plot(1:10,1:10,axes=FALSE,xlab="",ylab="")
polygon(runif(4,1,10),runif(4,1,10),col="lightblue")
points(runif(5,1,10),runif(5,1,10),cex=1.5,col="red")
points(runif(5,1,10),runif(5,1,10),pch="+",cex=1.7,col="green")
lines(1:10,runif(10,1,10),lty=2,lwd=2)
text(runif(5,1,10),runif(5,1,10),labels=c("uno","dos","tres","cuatro","cinco"),cex=1.7,col=rainbow(5))
abline(h=5,lty=4)
title("GrƔfico Variado")
axis(1,labels=c("uno","tres","cinco","siete","nueve"),at=seq(1,10,by=2))
axis(2,labels=1:10,at=1:10)
legend(8,3,lty=c(1:3),col=rainbow(3),legend=c("uno","dos","tres"))
Se utiliza este primer tipo de grƔfico para ejemplificar el como personalizar un grƔfico ya que todos estos atributos funcionan de forma muy similar para los demƔs grƔficos del paquete graphics.
Regresando a nuestro grĆ”fico en este caso podemos observar como existe una relación entre la velocidad del vehĆculo y la distancia que es este requiere para frenar.
Como se comentó anteriormente los grÔficos de dispersión nos permiten encontrar relaciones entre las variables numéricas, no en todos los casos el problema tiene sólo dos variables, para crear un pairs plot la función a utilizar es la función pairs indicÔndole el nombre del la hoja de datos sobre la que va a trabajar.
pairs(iris)
Como podemos ver tenemos como resultado una matriz en donde podemos ver las relaciones entre todas la variables de nuestra tabla, en este caso al ser la variable Specie una variable cualitativa es recomendable eliminarla del grƔfico.
pairs(iris[,1:4])
Aunque ya tenemos nuestro grÔfico sólo hace falta verlo para notar que su lectura e interpretación no son nada sencillas de realizar, una mejora que podemos realizar es la utilización de colores para representar las distintas especies de flores dentro de los datos, para esto utilizaremos el paquete RColorBrewer, en la siguiente imagen podemos ver las diferente paletas de colore que nos ofrece el paquete.
Para obtener una paleta de colores utilizando el paquete RColorBrewer debemos indicarle la cantidad de colores que necesitamos y cual es la paleta que colores que deseamos utilizar, estos colores se representan utilizando código hexadecimal.
paleta <- brewer.pal(3, "Set1")
paleta
[1] "#E41A1C" "#377EB8" "#4DAF4A"
Al tener 150 observaciones en la tabla de datos debemos indicar el color con al que se va a presentar a cada una, una forma de hacerlo es utilizando la variable Specie.
iris$Species
[1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
[ reached getOption("max.print") -- omitted 100 entries ]
Levels: setosa versicolor virginica
tipo <- as.numeric(iris$Species)
tipo
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[36] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[ reached getOption("max.print") -- omitted 100 entries ]
colores <- paleta[tipo]
colores
[1] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[8] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[15] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[22] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[29] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[36] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[43] "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C" "#E41A1C"
[50] "#E41A1C"
[ reached getOption("max.print") -- omitted 100 entries ]
pairs(iris[,1:4],
# TĆtulo principal
main = "Relación entre las variables largo y ancho del sépalo y pétalo
para las variedades de flor setosa, versicolor y virginica.",
pch = 21, # Tipo de la forma
cex.main = .95, # TamaƱo del tĆtulo
bg = colores) # Colores por especio.
Como podemos ver la lectura del grÔfico mejora considerablemente ya que hora sabemos cuantos grupos existen en los datos, por último agregaremos una leyenda que nos permite indicar que color representa a que especie.
pairs(iris[,1:4],
# titulo principal
main = "Relación entre las variables largo y ancho del sépalo y pétalo \n para las variedades de flor setosa, versicolor y virginica.",
pch = 21, # tipo de la forma
cex.main = .95, # tamaƱo del titulo
bg = alpha(colores,.7), # colores para las especies de flores
oma = c(7, 3, 7, 3),
cex = 1.5) # hacemos espacio extra (abajo,izquierda,arriba,derecha) para agregar la leyenda
legend("bottom", # leyenda en la perte inferior
title = "Especies :", # titulo de la leyenda
legend = as.character(unique(iris$Species)), # nombres de los grupos
fill = paleta, # colores de la leyenda
horiz = TRUE, # leyenda de forma horizontal
cex = .7, # tamaƱo del tĆtulo
xpd = T,
inset = -0.1) # ubicación de la leyenda
Existen también la posibilidad de realizar grÔficos de dispersión en 3 dimensiones esto nos permite identificar con mayor facilidad los grupos que existan en nuestros datos si se seleccionan correctamente la variables a utilizar y el angulo desde el que se observaran los datos.
library(scatterplot3d) # paquete para realizar los grƔficos en 3D
par(oma = c(3,2,1,2)) # se hace espacio extra para agregar la leyenda
scatterplot3d(x = iris$Petal.Width, # eje x
y = iris$Sepal.Length, # eje y
z = iris$Sepal.Width, # eje z
xlab = "Ancho Del PƩtalo",
ylab = "Largo Del SƩpalo",
zlab = "Ancho Del SƩpalo",
bg = colores,
pch = 21,
angle = 190, # Ɣngulo desde el que se obervan los datos.
main = "Dispersión de los individuos por largo del sépalo,
ancho del pƩtalo y ancho del sƩpalo.",
cex.main = 1) # tamaƱo del tĆtulo
legend("bottom", # ubicación de la leyenda
legend = levels(iris$Species), # nombres de los grupos
col = paleta, # colores
pch = 19, # tipo de forma
inset = -0.4,
xpd = T,
horiz = TRUE)
Como podemos ver en el grÔfico la dispersión de los datos es algo confusa, podemos intentar encontrar un mejor Ôngulo.
par(oma = c(3,2,1,2))
scatterplot3d(x = iris$Petal.Width,
y = iris$Sepal.Length,
z = iris$Sepal.Width,
xlab = "Ancho Del PƩtalo",
ylab = "Largo Del SƩpalo",
zlab = "Ancho Del SƩpalo",
bg = alpha(colores,.7),
pch = 21,
angle = 50, # cambia el Ɣngulo del grƔfico
main = "Dispersión de los individuos por largo del sépalo,
ancho del pƩtalo y ancho del sƩpalo.",
cex.main = 1,
cex.symbols = 2)
legend("bottom", legend = levels(iris$Species),
col = paleta,
pch = 19,
inset = -0.4,
xpd = T,
horiz = TRUE)
Como vemos desde el Ôngulo correcto se pueden identificar tres grupos y aunque existe algo de confusión entre los grupos versicolor y virginica estos pueden separarse con un error de clasificación bastante pequeño.
En los dos grÔficos anteriores estÔn pensados para representar datos numéricos, los grÔficos de barras nos permiten representar tanto variables cualitativas como cuantitativas, para esto caso utilizaremos un dataset que califica la obra de diversos pintores clÔsicos en base a su composición, dibujo, color, expresión ademas de indicar a que escuela pertenecieron.
library(MASS)
data("painters")
head(painters)
Composition Drawing Colour Expression School
Da Udine 10 8 16 3 A
Da Vinci 15 16 4 14 A
Del Piombo 8 13 16 7 A
Del Sarto 12 16 9 8 A
Fr. Penni 0 15 8 0 A
Guilio Romano 15 16 4 14 A
Lo primero a tomar en cuenta al utilizar la función barplot es que esta a diferencia de las que vimos anteriormente espera recibir una matriz y no una hoja de datos, para convertir nuestra hoja de datos en una matriz podemos utilizar el comando as.matrix, para poder ver los resultados con mayor claridad no graficaremos todos los datos.
datos <- as.matrix(painters[1,1:4]) # calificaciones del primer artista.
datos
Composition Drawing Colour Expression
Da Udine 10 8 16 3
barplot(datos,
main = "Calificaciones para el artista : Da Udine",
cex.main = 1, # tamaƱo del tĆtulo
ylab = "Calificación")
En la siguiente grƔfica nuestro objetivo serƔ graficar las 4 calificaciones de 5 artistas, por lo que seleccionamos los datos y los convertimos en una matriz.
datos <- as.matrix(painters[1:5, 1:4]) # se seleccionan los primeros 5 pintores de la tabla
datos
Composition Drawing Colour Expression
Da Udine 10 8 16 3
Da Vinci 15 16 4 14
Del Piombo 8 13 16 7
Del Sarto 12 16 9 8
Fr. Penni 0 15 8 0
En el grƔfico las barras representan a las variables, como podemos ver los datos a representar que son observaciones de nuestra tabla (filas) y no columnas (variables), una forma sencilla de solucionar esto es transponiendo la matriz de datos.
datos <- t(datos) # se transpone la matriz
datos
Da Udine Da Vinci Del Piombo Del Sarto Fr. Penni
Composition 10 15 8 12 0
Drawing 8 16 13 16 15
Colour 16 4 16 9 8
Expression 3 14 7 8 0
colores <- brewer.pal(4, "Set2")
par(mar = c(4,6,4,6))
barplot(datos,
main = "Calificaciones de artistas clĆ”sicos hechas por el crĆtico Roger de Piles",
cex.main = 1,
cex.names = .7,
ylab = "Calificación",
col = colores,
beside = TRUE,
legend.text = T,
args.legend = list(x = "right",
bty = "n",
inset = c(-0.25, 0),
xpd = TRUE,
title = "CategorĆas : "),
border = "white")
Como podemos ver en la grƔfica al tener varios individuos estos son agrupados en pequeƱos grƔficos independientes donde se pueden observar las diferentes variables, existen tambiƩn una forma de representar los datos en forma de pila donde todas las variables se representan en una sola barra.
colores <- brewer.pal(4, "Set2")
par(mar = c(4,6,4,6))
barplot(datos,
main = "Calificaciones de artistas clĆ”sicos hechas por el crĆtico Roger de Piles",
cex.main = 1,
cex.names = .7,
ylab = "Calificación",
col = colores,
legend.text = T,
args.legend = list(x = "right",
bty = "n",
inset = c(-0.30,0),
xpd = TRUE, title = "CategorĆas : "),
border = "white")
datos <- painters$School
datos
[1] A A A A A A A A A A B B B B B B C C C C C C D D D D D D D D D D E E E
[36] E E E E F F F F G G G G G G G
[ reached getOption("max.print") -- omitted 4 entries ]
Levels: A B C D E F G H
Al no ser nuestra variable numérica tenemos que realizar un conteo de nuestra variable para esto podemos utilizar la función table.
datos <- table(datos)
datos
datos
A B C D E F G H
10 6 6 10 7 4 7 4
datos <- t(datos)
datos
datos
A B C D E F G H
[1,] 10 6 6 10 7 4 7 4
# datos <- t(table(painters$School))
barplot(datos)
Aunque ya tenemos la grÔfica es recomendable hacer algunos cambios que faciliten la lectura e interpretación.
escuelas <-c("Renaissance","Mannerist","Seicento","Venetian","Lombard","Sixteenth Century","Seventeenth Century","French")
par(mar = c(4,6,4,6))
barplot(datos,
main = "Distribución de los pintores calificados segun la escuela a la que pertenecen",
cex.main = 1,
names = escuelas,
horiz = T,
cex.names = .6,
las = 1,
border = "white")
Este es junto con el grĆ”fico de barras uno de los tipos de grĆ”ficos mĆ”s iconicos de la estadĆstica, formado con un circulo que se divide en mĆŗltiples porciones (como un pastel) utilizado normalmente para representar porcentajes o proporciones.
La función para crear grÔficos de pastel en el paquete grÔficos se llama pie, entre sus principales parÔmetros estÔn :
grupos <- c(18, 30, 32, 10, 10)
etiquetas <- c("A", "B", "C", "D", "F")
colores <- brewer.pal(5, "Blues")
pie(x = grupos, labels = etiquetas, col = colores)
Para este ejemplo se tomaran al azar 75 observaciones de la tabla de datos iris.
muestra <- sample(iris$Species,75)
distribucion <- table(muestra)
distribucion
muestra
setosa versicolor virginica
30 22 23
distribucion <- sort(distribucion,decreasing = T)
distribucion
muestra
setosa virginica versicolor
30 23 22
Como vemos ademas de los parĆ”metros entes indicados podemos enviarle el resultado del comando table, mejorar la interpretación del grĆ”fico es recomendable ordenar las variables antes de realizar el grĆ”fico, a continuación se ordenan las variables las etiquetas y se les agrega el sĆmbolo de porcentaje ā%ā.
distribucion.prop <- round(prop.table(distribucion),2) * 100
distribucion.prop
muestra
setosa virginica versicolor
40 31 29
distribucion.prop <- paste0(distribucion.prop,"%")
distribucion.prop
[1] "40%" "31%" "29%"
colores <- brewer.pal(3, "Greens")
pie(x = distribucion,
labels = distribucion.prop,
col = colores,
main = "Distribución de las especies en la tabla de datos iris")
legend("topleft",
legend = names(distribucion),
cex = 1,
fill = colores,
title = "Especie :")
Este tipo de grÔfica es utilizada para visualizar la frecuencia con la que se distribuyen los datos, normalmente se presenta como un grÔfico de barras donde el Ôrea de la grÔfica representa la frecuencia de los valores representados, la función utilizada para crear un historial en R es llama hist
hist(mtcars$mpg)
color <- brewer.pal(3,"Dark2")
hist(mtcars$mpg,
main = "Distribución de 32 vehiculos segun su consumo de combustible
segĆŗn Motor Trend US magazine para modelos 1973 - 1974",
xlab = "Rendimiento de combustible Millas/Galon",
ylab = "Frecuencia",
col = color[1])
En el siguiente grƔfico se muestra el como puede leerse un este tipo de grƔfico
Otro uso frecuente de los histogramas es ver la distribución de probabilidad de los datos y compararlo contra una distribución normal.
color <- brewer.pal(3,"Dark2")
hist(mtcars$mpg,
prob = TRUE, # se grafica la distribución de probabilidad.
main = "Distribución de 32 vehiculos segun su consumo de combustible
segĆŗn Motor Trend US magazine para modelos 1973 - 1974",
xlab = "Rendimiento de combustible (Millas/Galon)",
ylab = "Frecuencia",
col = color[1])
lines(density(mtcars$mpg), col = color[2], lwd = 2) # densidad de los datos
lines(density(mtcars$mpg, adjust = 2), lty = "dotted", col = color[3], lwd = 2) # distribución normal
Este tipo de grĆ”fico representa en base a cuartile las distribución de frecuencias e indica los datos atĆpicos o extremos.
boxplot(iris[,1:4],
col = color[1],
outcol = "black",
outpch = 19,
main = "Valores atĆpicos para la tabla de datos iris")
par(mar = c(3,8,3,2))
boxplot(iris[,1:4],
col = color[1],
outcol = "black",
outpch = 19,
main = "Valores atĆpicos para la tabla de datos iris",
names = c("Largo de sƩpalo","Ancho del sƩpalo","Largo del pƩtalo","Ancho del pƩtalo"),
horizontal = T,
las = 1,
cex.names = 1)
Este tipo de grÔfico nos permite determinar de forma visual si existe correlación entre nuestras variables, para esto utilizaremos la función cor para calcular la matriz de correlaciones y la función corrplot del paquete corrplot para graficarlo.
library(corrplot)
correlaciones <- cor(iris[,-5])
correlaciones
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
corrplot(correlaciones)
corrplot(correlaciones,
method = "color",
title = "Correlación entre las variables de la tabla iris",
tl.cex = .6,
tl.srt = 0,
mar = c(1,1,2,1))
muestra <- iris[sample(1:150,60),]
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
barplot(table(muestra$Species))
title("Combinacion de varios graficos")
pie(table(muestra$Species))
plot(muestra$Sepal.Length,muestra$Sepal.Width)
Ggplot2 nos plantea un paradigma diferente en el desarrollo de visualizaciones basadose en la teorĆa de la āgramĆ”tica de los grĆ”ficosā, donde en lugar de construir el grĆ”fico lo que se hacer es describir cuales son los componentes que no forman.
library(ggplot2)
ggplot()
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length , y = Sepal.Width))
ggplot(data = iris) +
geom_point(mapping = aes(x = Sepal.Length , y = Sepal.Width, color = Species))
ggplot(data = iris) +
geom_point(mapping = aes(x = iris$Sepal.Length , y = iris$Sepal.Width, color = Species)) +
labs(title = "Dispersión de las especies de la flores setosa, virginica \n y versicolor segun el largo y ancho de su sépalo",
x = "Largo del sƩpalo",
y = "Ancho del sƩpalo",
color = "Especies :") +
theme(plot.title = element_text(hjust = 0.5)) +
theme_bw()
ggplot(data = iris) +
geom_point(mapping = aes(x = iris$Sepal.Length , y = iris$Sepal.Width, color = Species)) +
labs(title = "Dispersión de las especies de la flores setosa virginica \n y versicolor segun el largo y ancho de su sépalo",
x = "Largo del sƩpalo",
y = "Ancho del sƩpalo",
color = "Especies :") +
facet_wrap(~Species) + # se indica la variable por la que se separaran los grƔficos
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
Para mÔs información al respecto pueden consultar la documentación online en el siguiente enlace: http://ggplot2.tidyverse.org/reference/#section-layer-geoms
library(GGally)
ggpairs(data = iris, columns = 1:4,
title = "Relación entre las variables largo y ancho del sépalo y pétalo \n para las variedades de flor setosa, versicolor y virginica",
mapping = aes(color = Species, alpha = .7)) +
theme_bw()
library(reshape2)
iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
[ reached getOption("max.print") -- omitted 140 rows ]
iris2 <- melt(iris, id.vars="Species")
iris2
Species variable value
1 setosa Sepal.Length 5.1
2 setosa Sepal.Length 4.9
3 setosa Sepal.Length 4.7
4 setosa Sepal.Length 4.6
5 setosa Sepal.Length 5.0
6 setosa Sepal.Length 5.4
7 setosa Sepal.Length 4.6
8 setosa Sepal.Length 5.0
9 setosa Sepal.Length 4.4
10 setosa Sepal.Length 4.9
11 setosa Sepal.Length 5.4
12 setosa Sepal.Length 4.8
13 setosa Sepal.Length 4.8
14 setosa Sepal.Length 4.3
15 setosa Sepal.Length 5.8
16 setosa Sepal.Length 5.7
[ reached getOption("max.print") -- omitted 584 rows ]
ggplot(data=iris2) +
geom_bar(aes(x = Species, y = value, fill = variable), stat="identity", position="dodge") +
labs(title = "Ancho y largo del sƩpalo y pƩtalo",
subtitle = "para las variedades de flores sƩtona, versicolor y virginica",
x = "Especies",
y = "Valores",
fill = "Tipo de flor:",
caption = "Fuente: tabla de datos iris") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
library(reshape2)
iris2 <- melt(iris, id.vars = "Species")
iris2
Species variable value
1 setosa Sepal.Length 5.1
2 setosa Sepal.Length 4.9
3 setosa Sepal.Length 4.7
4 setosa Sepal.Length 4.6
5 setosa Sepal.Length 5.0
6 setosa Sepal.Length 5.4
7 setosa Sepal.Length 4.6
8 setosa Sepal.Length 5.0
9 setosa Sepal.Length 4.4
10 setosa Sepal.Length 4.9
11 setosa Sepal.Length 5.4
12 setosa Sepal.Length 4.8
13 setosa Sepal.Length 4.8
14 setosa Sepal.Length 4.3
15 setosa Sepal.Length 5.8
16 setosa Sepal.Length 5.7
[ reached getOption("max.print") -- omitted 584 rows ]
iris3 <- iris[sample(1:nrow(iris), 110), ]
quan <- as.vector(table(iris3$Species))
pos <- cumsum(quan) - quan/2
quantity <- data.frame(Species = c("sƩtosa", "versicolor", "virginica"),
quantity = quan,
position = pos)
quantity
Species quantity position
1 sƩtosa 33 16.5
2 versicolor 42 54.0
3 virginica 35 92.5
ggplot(iris3, aes(x=factor(1), fill=Species)) +
geom_bar(width=1) +
geom_text(data=quantity,
aes(x=factor(1),
y=position,
label=quantity) ,
size=5) +
labs(x="", y="") +
coord_polar(theta="y")
ggplot(data=iris, aes(x = Sepal.Width)) +
geom_histogram(binwidth = 0.2, color = "black", fill = "steelblue", aes(y = ..density..)) +
geom_density(stat = "density", alpha = I(0.2), fill = "blue") +
xlab("Ancho del sƩpalo") +
ylab("Densidad") +
ggtitle("Histograma y curva de densidad")
qplot(iris$Sepal.Length, iris$Sepal.Width)
qplot(iris$Species)
qplot(iris$Sepal.Width)
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Existen una serie de temas que podemos aplicar a nuestros grƔficos para mejorar su aspecto.
ggplot(mpg, aes(x = class , y= hwy)) +
scale_x_discrete() +
geom_jitter(aes(color = class, x = class),
position = position_jitter(width = .05), alpha = 0.5) +
geom_boxplot(aes(color = class), outlier.colour = NA, position = "dodge") +
xlab("Clase") + ylab("Millas por galon")
library(ggthemes)
ggplot(mpg, aes(x = class , y= hwy)) +
scale_x_discrete() +
geom_jitter(aes(color = class, x = class),
position = position_jitter(width = .05), alpha = 0.5) +
geom_boxplot(aes(color = class), outlier.colour = NA, position = "dodge") +
labs(x ="Clase", y = "Millas por galon", color = "Clase") +
theme_fivethirtyeight()+
scale_colour_few()
library(ggthemes)
ggplot(mpg, aes(x = class , y= hwy)) +
scale_x_discrete() +
geom_jitter(aes(color = class, x = class),
position = position_jitter(width = .05), alpha = 0.5) +
geom_boxplot(aes(color = class), outlier.colour = NA, position = "dodge") +
labs(x ="Clase", y = "Millas por galon", color = "Clase") +
theme_wsj() +
scale_colour_pander()