############################################# #VISUALIZACION DE CANTIDADES ############################################# #En este laboratorio veremos #1.-DIAGRAMAS DE BARRA #2.-DIAGRAMAS DISPERSION (SCATTER PLOT) ############################################# #En muchos escenarios, estamos interesados en la magnitud de alg?n conjunto de n?meros. #Por ejemplo, es posible que queramos visualizar el volumen total de ventas de diferentes #marcas de autom?viles o el n?mero total de personas que viven en diferentes ciudades. #La visualizaci?n est?ndar en este escenario es el gr?fico de barras, que tiene algunas #variantes, incluidas barras simples y barras agrupadas y apiladas. Las alternativas #al diagrama de barras son el diagrama de puntos (SCATTER CHARTS) y el mapa de calor. ##################################### #DIAGRAMAS DE BARRA #################################### #Hay dos tipos de gr?ficos de barras: geom_bar () y geom_col (). #geom_bar () hace que la altura de la barra sea proporcional al n?mero de casos #en cada grupo. Si desea que las alturas de las barras representen valores en los datos, #use geom_col() en su lugar. #geom_bar() usa stat_count() por defecto: cuenta el n?mero de observaciones en cada posici?n x. #geom_col() usa stat_identity(): deja los datos como est?n. #geom_bar aes incluye las siguientes propiedades : #x y alpha colour fill group linetype size rm(list=ls()) require(dplyr) require(ggplot2) require(ggplot2movies) require(scales) require(lubridate) data(mpg) names(mpg) unique(mpg$class) #Vamos a crear un diagrama de barras sobre la variable class #por defecto X es mapeado a la variable #En este caso, si voy a contar registros solo necesito indicar la columna que es el factor ggplot(mpg, aes(x=class))+ geom_bar() #Si mapeamos la Y a la variable, el gr?fico que se presenta es de barras horizontales ggplot(mpg, aes(y=class))+ geom_bar() #Si queremos agrupar la data basado en otro factor usaremos fill y color #note que en este caso el aesthetics esta parte en el #ggplot y parte en el geom. Esto demuestra el concepto de herencia ggplot(data=mpg , aes(y=class))+ geom_bar(aes(fill = drv)) #O todo junto en el geom() ggplot(data=mpg )+ geom_bar( aes(y=class, fill = drv)) #El orden en el que aparecen las barras depende del factor # Si se requiere cambiar el orden de los segmentos de cada barra solo tenemos #que indicarle el orden de sort a-z o z-a ggplot(mpg, aes(y=class)) + geom_bar(aes(fill = drv), position = position_stack(reverse = TRUE)) #Note que el orden se refiere a la posici?n de los factores en las columnas y NO #al orden que aparece en eje X o Y #Note tambi?n que estos diagramas tienden a ser confusos porque no es claro si el valor de drv=4 #va desde que termina la columna f o va desde 0 #Por defecto geom_bar usa stat_count(), es decir cuenta la cantidad de registros # y eso despliega. #Pero si deseo sumar columnas de valores de cada class, deberemos cambiar el stat #stat="identity" ggplot(data=mpg , aes(x=class ,y=cty))+ geom_bar(aes( fill = drv), stat="identity") #El ejercicio anterior en realidad no hace mucho sentido, porque est? sumando las #millas por gal?n en ciudad de todos los carros por clase, con un poco de data #wrangling podemos sacar la media #usaremos geom_col() en lugar de bar porque bar nos deplegar? siempre 1. mpg <- as.data.frame(mpg) mpg1 <- aggregate(x=mpg , by=list(CLASE=mpg$class),FUN=mean) ggplot( data=mpg1 , aes(x=CLASE, y=cty ))+ geom_col() #geom_col es similar a geom_bar pero geom_col se utiliza m?s con variables #discretas, mientras que geom_bar puede usarse con variable continuas #Otra buena pr?ctica es colocar el valor en el gr?fico. #Es necesario cuando los valores son importantes y/o la escala de los ejes es muy grande # para esto usamos geom_text. Veamos un ejemplo df <- data.frame(trt = c("a", "b", "c"), salida = c(2.3, 1.9, 3.2)) ggplot(df, aes(x=trt, y=salida, fill=trt)) + geom_col()+ geom_text(aes(label=salida), vjust=1.6, color="white", size=3.5) #Desafortunadamente esto no se puede aplicar cuando hay varios subsets, veamos como #nos saldr? ggplot(data=mpg , aes(x=class ,y=cty))+ geom_bar(aes( fill = drv), stat="identity", position="dodge" ) + geom_text(aes(label=cty),size=3.5,hjust=1, vjust=1.6) #Esto es porque label=cty nos da un vector y no un ?nico valor num?rico #tenemos que hacer un poco de manipulaci?n (data wrangling) mpg <- as.data.frame(mpg) mpg1 <- aggregate(x=mpg , by=list(CLASE=mpg$class , DRV=mpg$drv),FUN=mean) mpg1$cty <- round(mpg1$cty) ggplot( data=mpg1 , aes(x=CLASE, y=cty, fill= DRV ))+ geom_col(position="dodge")+ geom_text(aes(label=cty),size=3.5,hjust=0, vjust=1.6) #Otra buena pr?ctica es el ordenamiento #El orden que aparecen las columnas esta dado por el orden natural del factor por #el cual se agrup?. Pero como hemos visto, siempre agrupamos de mayor a menor para #ser consistentes con la Gestalt y los patrones de visualizaci?n #En este caso necesitamos un pre procesamiento ya que ggplot no lo hace #Veamos con mpg para contar registros mpg1 <- aggregate(x=mpg , by=list(unique.values=mpg$class),FUN=length) ggplot(mpg1, aes(x = reorder(unique.values, -class), y = class)) + geom_bar(stat = "identity" , fill="darkolivegreen4")+ geom_text(aes(label=class),size=3.5,hjust=0, vjust=1.6) #El signo menos (-) en la funci?n reorder indica que ordene de acuerdo a class #en forma descendente #sin el signo menos (-) seria ascendente #Otro tema intereante es el resaltar un dato en especial mpg1 <- aggregate(x=mpg , by=list(unique.values=mpg$class),FUN=length) mpg1$resaltado <- NA mpg1[mpg1$unique.values=="suv" ,]$resaltado="si" ggplot(mpg1, aes(x = reorder(unique.values, -class), y = class, fill=resaltado)) + geom_bar(stat = "identity")+ geom_text(aes(label=class),size=3.5,hjust=0, vjust=1.6) #Por ?ltimo no se olvide de poner los t?tulos correspondientes ggplot(mpg1, aes(x = reorder(unique.values, -class), y = class, fill=resaltado)) + geom_bar(stat = "identity") + geom_text(aes(label=class),size=3.5,hjust=0, vjust=1.6)+ ggtitle("An?lisis de mpg ")+ xlab("Class") + ylab("n?mero") ####################################### #DIAGRAMAS DISPERSI?N (SCATTER PLOT) ####################################### #El diagrama de dispersi?n gr?fica pares de datos num?ricos, con una variable en cada eje, #para buscar una relaci?n entre ellos. #El diagrama nos permitir? unir los puntos mediante una l?nea para ver tendencias o relaciones #Cuando usar este tipo de diagrama: # Cuando haya datos num?ricos emparejados # Cuando su variable de respuesta puede tener m?ltiples valores para cada valor de su variable # predictoras # Al intentar determinar si las dos variables est?n relacionadas, como por ejemplo: # Al intentar identificar las posibles causas raiz de los problemas # Al determinar si dos efectos que parecen estar relacionados ambos ocurren con la misma causa # Al probar la auto correlaci?n antes de construir un gr?fico de control data(mtcars) names(mtcars) ggplot(mtcars, aes(wt, mpg)) + geom_point() #geom_point entiende los siguientes aes #x y alpha colour fill group shape size stroke ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(colour = "tomato4", size = 3) #Podemos definir color basado en un factor ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes(colour = factor(cyl))) #Podemos definir forma basado en un factor ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes(shape = factor(cyl))) #O basado en un color o ambos ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes(shape = factor(cyl), colour=factor(cyl))) #Usando aes size se puede crear un diagrama de burbuja con el mismo geom ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point(aes( size = qsec), colour="aquamarine3") #La variaci?n de alpha es ?til para dataset muy grandes porque permite ver # puntos que est?n por detr?s data(diamonds) ggplot(diamonds, aes(carat, price)) + geom_point(alpha = 1/10) ggplot(diamonds, aes(carat, price)) + geom_point(alpha = 1/20) ggplot(diamonds, aes(carat, price)) + geom_point(alpha = 1/100) #Para formas que tienen un borde como la 21 que tiene forma de donut #se puede colorear el interior y exterior en forma separada. #se puede usar stroke para definir el tama?o de la l?nea . ggplot(mtcars, aes(wt, mpg)) + geom_point(shape = 21, colour = "black", fill = "palevioletred3", size = 2, stroke = 1) #Se pueden crear figuras interesantes usando varias capas de geom_point ggplot(mtcars, aes(mpg, wt, shape = factor(cyl))) + geom_point(aes(colour = factor(cyl)), size = 4) + geom_point(colour = "black", size = 1.5) #lo que quiere decir que el punto debe ser color (casi negro) de tama?o 1.5 #pero el contorno depende del factor y tiene tama?o 4 #Se pueden lograr muchas combinaciones de estos argumentos, pero no hay que abusar porque el #diagrama se vuelve dif?cil de digerir ggplot(mtcars, aes(mpg, wt, shape = factor(cyl))) + geom_point(colour = "pink", size = 4) + geom_point(aes(shape = factor(cyl))) #Una limitaci?n importante de las barras es que deben comenzar en cero, #de modo que la longitud de la barra sea proporcional a la cantidad mostrada. #Para algunos conjuntos de datos, esto puede ser poco pr?ctico. #En este caso, podemos indicar cantidades colocando puntos en las ubicaciones #apropiadas a lo largo de ejes x o y y limitando el ?rea de despliegue ggplot(mtcars, aes(x=mpg, y=wt)) + geom_point() + xlim(15, 25) + ylim(2.5,4) #Cuando los puntos se sobreponen es dif?cil apreciar cuantos puntos hay #recurrimos a geom_jitter() #geom_jitter introduce una variaci?n en los valores de forma aleatoria de tal #manera de que se pueda visualizar adecuadamente data(mpg) ggplot(mpg, aes(x=cyl, y=hwy)) + geom_point(aes(colour=cyl) )+ geom_jitter() #Eventualmente necesitamos unir los puntos mediante una l?nea #creando columnas nuevas columnas data(economics) economics$a?o <- year(economics$date) economics$mes <- month(economics$date, label=TRUE) economics class(economics) #podemos crear un filtro a la data para hacer m?s visible #en este caso todos los registros mayores que a?o 2000 econ200 <- economics[which(economics$a?o >2000),] graf3 <-ggplot(econ200, aes(x=mes,y=pop)) + geom_point()+ geom_line(aes(color=factor(a?o), group=a?o)) + scale_color_discrete() + labs(title="poblacion", x= "mes", y="poblacion")+ theme(axis.text.x=element_text(angle=90, vjust=1)) graf3 ####################################### #DIAGRAMAS RADAR (ARA?A) ####################################### #Un diagrama de ara?a, tambi?n conocido como gr?fico de radar o de #estrella, es una herramienta visual utilizada para comparar m?ltiples #variables en relaci?n a un punto central. #Cada eje del diagrama representa una variable diferente y los valores #se trazan a lo largo de estos ejes. #Los puntos se conectan formando una figura poligonal, similar a #una telara?a. #De hecho, es m?s ?til que los gr?ficos lineales convencionales que no son #adecuados para la comparaci?n y evaluaci?n de variables m?ltiples. #En estos casos, un gr?fico de radar es la mejor opci?n #Necesitamos cargar el paquete ggradar que no se encuentra en CRAN por lo que #tenemos que bajarlo de github. #Dependiendo de la versi?n de R es posible que requiera bajar y compilar #fuentes en cuyo caso requiere el paquete devtools #require(devtools) #install.github("ricardo-bion/ggradar) require(ggradar) #Veamos un ejemplo con mtcars mtcars_radar <- mtcars %>% as_tibble(rownames = "group") %>% mutate_at(vars(-group), rescale) %>% tail(4) ggradar(mtcars_radar) #Explicaci?n de la funci?n #En primer lugar debemos crear una nueva columna llamada group #en segundo lugar debemos reescalar las variables num?ricas, debido a que #no todas las variables est?n dentro de los mismos valores, entonces #reescalamos con valores m?ximos de 1 ( 100%). #Por ?ltimo debemos limitar la cantidad de observaciones debido a que estos #gr?ficos tienden a congestionarse r?pidamente . #el objeto resultante esta listo para visualizarse con la funci?n ggradar. #Cuando tenemos muchas observaciones y/o variables puede ser interesante # sombrear el pol?gono para lo cual podemos usar los argumentos fill y fill.alpha mtcars_radar <- mtcars %>% as_tibble(rownames = "group") %>% mutate_at(vars(-group), rescale) mtcars_radar <- mtcars_radar[1:10 , ] View(mtcars_radar) ggradar(mtcars_radar, fill=TRUE, fill.alpha=0.2)