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: