2012-10-07 23 views
11

Estoy queriendo crear un diagrama de cinta (realmente es un diagrama de líneas de múltiples grupos de una variable categórica) pero se muestra en un estilo 3d. Esto sería algo como esto:¿Cómo crear un diagrama de cinta?

Ribbon plot example

Así que tal vez nos gustaría trazar los siguientes datos de la muestra como una trama de la cinta:

set.seed(10) 
fun <- function(i) data.frame(person=rep(LETTERS[i], 26), 
    letter=letters, count=sample(0:100, 26, T)) 
dat <- do.call(rbind, lapply(1:10, function(i) fun(i))) 

library(ggplot2) #a traditional 2-d line plot of the data 
ggplot(data=dat, aes(x=letter, y=count, group=person, color=person)) + 
    geom_line() 

¿Cómo se puede lograr esto en R? Sé que puede haber mejores formas de mostrar los datos pero mi interés actualmente es producir la trama estilo cinta.

Respuesta

16

Esperemos que el ejemplo a continuación le ayudará a usted en la dirección correcta:

# data 
mat <- matrix(dpois(rep(1:20, 10), lambda=rep(10:1, each=20)), ncol=10) 

# 2d line plot 
matplot(mat, type="l", col="black", lty=1) 

# 3d ribbon plots 
par(mar = c(0, 1, 0, 1)) 
par(mfrow=c(1,2)) 
persp(z=mat[,rep(seq(ncol(mat)), each=2)], r=5, theta=320, phi=35, shade=0.5, 
     border=NULL, col=rep(c("#808080FE","#00000000"), each=nrow(mat)-1)) 
persp(z=mat[,rep(seq(ncol(mat)), each=2)], r=5, theta=320, phi=35, shade=0.5, 
     border=NA, col=rep(c("#808080FE","#00000000"), each=nrow(mat)-1)) 
par(mfrow=c(1,1)) 
par(mar = c(5,4,4,2)+.1) 

ribbon_example

Como se puede ver, la idea básica aquí es bastante simple. Organizamos nuestros valores para ser trazados en una matriz, duplicamos las columnas en la matriz para que estén en pares, y luego graficamos los valores usando persp(), asegurándonos de alternar entre colores transparentes y opacos. Sin embargo, hay algunos detalles complicados que aún deben resolverse, particularmente con respecto a qué hacer con el parámetro border. Te dejaré esos detalles.

Espero que esto ayude.

Cuestiones relacionadas