scatterplot densidades
Gráficos de dispersión y sus densidades con ggplot2
Con este tipo de gráfico podemos generar un gráfico de dispersión (scatterplot) y de manera simultane adicionar las densidades marginales de las variables involucradas, que a su vez están discriminadas por las categorías de otra variable. La idea original de este gráfico se encuentra en gRaphics y también se encuentra referenciada en R-bloggers.
Para poder realizar el gráfico debemos cargar antes la librería ggplot2:
library(ggplot2)
Además, necesitaremos la función theme_invisible() la cual permite crear un "tema" en los gráficos ggplot2 que solo muestra el gráfico realizado (en este caso las densidades), sin fondo, ni ejes, ni leyendas. Esta función la encontramos en Sape o también la pueden descargar aquí (ir al final de la página).
Para facilitar el uso de este tipo de gráficos, a continuación se crean un par de funciones vplayout() y xyden(), la segunda hecha para aplicar sobre cualquier data.frame que contenga en sus dos primeras columnas las variables "X" y "Y" y en la tercera la variable de clasificación.
vplayout = function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
xyden = function(df,nom = colnames(df),col=1:nlevels(df[,3]),posleg=c(1.2,1.2)){
require(ggplot2)
p1 = ggplot(df) + scale_fill_manual(values=col) +
geom_density(aes(x = df[,1], y = -..count..), fill="#CCCCCCCC", position = "stack") +
geom_density(aes(x = df[,1], y = ..count.., fill = df[,3], alpha=0.4)) +
theme_invisible()+opts(legend.position = "none")
p2 = ggplot(df) + scale_fill_manual(values=col) +
geom_density(aes(x = df[,2], y = -..count..), fill="#CCCCCCCC", position = "stack") +
geom_density(aes(x = df[,2], y = ..count.., fill = df[,3], alpha=0.4)) +
theme_invisible() + opts(legend.position = "none") + coord_flip()
p3 = qplot(df[,1], df[,2], data = df, colour=df[,3],ylab=nom[2],xlab=nom[1]) +
opts(legend.position=posleg) + scale_colour_manual(values=col,name=nom[3])
grid.newpage()
pushViewport(viewport(layout = grid.layout(5, 5))) # a 5 by 5 grid
print(p1, vp=vplayout(1,1:4))
print(p3, vp=vplayout(2:5,1:4))
print(p2, vp=vplayout(2:5,5))
}
Finalmente, vemos el uso de esta función con las bases "mpg", "diamonds" e "iris":
Con mpg:
displ = jitter(mpg$displ)
hwy = jitter(mpg$hwy)
cyl = factor(mpg$cyl)
df = data.frame(displ,hwy,cyl)
xyden(df,posleg=c(.9, .8))
Con diamonds:
Quilate = diamonds$carat
Precio = diamonds$price
Corte = diamonds$cut
df = data.frame(Quilate,Precio,Corte)
xyden(df,posleg=c(.85, .4))
Con iris:
Length = jitter(iris[,c("Sepal.Length")])
Width = jitter(iris[,c("Sepal.Width")])
Species = factor(iris[,c("Species")])
df=data.frame(Length,Width,Species)
xyden(df,col=2:4,posleg=c(1.1, 1.1))
Comparte esto: