2011-02-17 15 views
20

Esta pregunta es una continuación de la anterior question que pregunté.Obtener un diagrama de área apilada en R

Ahora tengo un caso en el que también hay una columna de categoría con Prop. Por lo tanto, el conjunto de datos se convierte como

Hour Category  Prop2 

00  A   25 
00  B   59 
00  A   55 
00  C   5 
00  B   50 
... 
01  C   56 
01  B   45 
01  A   56 
01  B   35 
... 
23  D   58 
23  A   52 
23  B   50 
23  B   35 
23  B   15 

En este caso lo que necesito para hacer una gráfica de áreas apiladas en R con los porcentajes de estos diferentes categorías para cada día. Entonces, el resultado será similar.

 A   B  C  D 
00  20%  30%  35%  15% 
01  25%  10%  40%  25% 
02  20%  40%  10%  30% 
. 
. 
. 
20 
21 
22  25%  10%  30%  35% 
23  35%  20%  20%  25% 

Así que ahora me gustaría conseguir la participación de cada categoría en cada hora y luego parcela Esta es una área de trazado apilados como éste, donde el eje x es la hora y el eje Y el porcentaje de Prop2 para cada categoría dada por los diferentes colores this

+1

Yo diría que esto es más bien un caso de la fortuna (197) ... ;-) –

Respuesta

7

puede utilizar stackpoly del paquete plotrix:

library(plotrix) 
#create proportions table 
pdat <- prop.table(xtabs(Prop2~Hour+Category,Dat),margin=1) 
#draw chart 
stackpoly(pdat,stack=T,xaxlab=rownames(pdat)) 
#add legend 
legend(1,colnames(pdat),bg="#ffffff55",fill=rainbow(dim(pdat)[2])) 
+0

Esto parece funcionar y me da la trama de pila, pero no hay leyendas para decir qué pila de colores representa qué categoría? – sfactor

+0

Primero debe ordenar sus categorías para saber cuál es cuál y luego crear su propia leyenda con el comando legend(). – John

+0

@sfactor Se agregó una leyenda de ejemplo, lea '? Legend' para obtener más detalles sobre cómo funciona esto – James

26

Usted puede utilizar el paquete de ggplot2 Hadley Wickham para eso.

R> library(ggplot2) 

Un conjunto de datos de ejemplo:

R> d <- data.frame(t=rep(0:23,each=4),var=rep(LETTERS[1:4],4),val=round(runif(4*24,0,50))) 
R> head(d,10) 
    t var val 
1 0 A 1 
2 0 B 45 
3 0 C 6 
4 0 D 14 
5 1 A 35 
6 1 B 21 
7 1 C 13 
8 1 D 22 
9 2 A 20 
10 2 B 44 

Y entonces usted puede utilizar ggplot con geom_area:

R> ggplot(d, aes(x=t,y=val,group=var,fill=var)) + geom_area(position="fill") 

enter image description here

+0

gracias, pero ¿qué pasa con obtener la proporción (porcentaje o proporción) de cada categoría por cada hora desde la tabla inicial hasta el formulario que muestra en el conjunto de datos 'd' aquí? – sfactor

+0

Disculpa, no he visto esto por tu pregunta. De hecho, creo que 'ggplot2' puede hacer eso por ti: he editado mi publicación para mostrar cómo hacerlo. – juba

+0

disculpa molestar otra vez, todavía simplificas los datos, en la forma inicial hay repetición de la Categoría para cada hora. Entonces, puede haber múltiples filas de la Categoría A en la hora 0, entonces, ¿cómo agrego cada una de estas categorías para cada hora para ponerlas en la forma que usted ha mostrado aquí? – sfactor

-2

Si usted quiere tomar las fronteras de distancia se puede use scale_x_discrete y coord_cartesian esta manera

p <- ggplot(d, aes(x=Date,y=Volume,group=Platform,fill=Platform)) + geom_area(position="fill") 
base_size <- 9 
p + theme_set(theme_bw(base_size=9)) + scale_x_discrete(expand = c(0, 0)) + coord_cartesian(ylim=c(0,1)) 
+0

Para mí, esto agrupa todo el gráfico para ocupar solo una pequeña fracción del área de trazado de la derecha. –

Cuestiones relacionadas