2013-08-20 4 views
5

Ecco il mio dati semplificata:come inserire l'etichetta percentuale in ggplot quando geom_text non è adatto?

company <-c(rep(c(rep("company1",4),rep("company2",4),rep("company3",4)),3)) 
product<-c(rep(c(rep(c("product1","product2","product3","product4"),3)),3)) 
week<-c(c(rep("w1",12),rep("w2",12),rep("w3",12))) 

mydata<-data.frame(company=company,product=product,week=week) 
mydata$rank<-c(rep(c(1,3,2,3,2,1,3,2,3,2,1,1),3)) 
mydata=mydata[mydata$company=="company1",] 

E, codice R che ho usato:

ggplot(mydata,aes(x = week,fill = as.factor(rank))) + 
geom_bar(position = "fill")+ 
scale_y_continuous(labels = percent_format()) 

Nella trama bar, voglio etichettare la percentuale in settimana, per rango. Il problema è il fatto che i dati non hanno percentuale di rank. E la struttura di questi dati non è adatta per averne uno. (ovviamente, i dati originali hanno molte più osservazioni rispetto all'esempio)

C'è qualcuno che può insegnarmi Come posso etichettare la percentuale in questo grafico?

risposta

15

Non sono sicuro di aver capito perché geom_text non è adatto. Ecco una risposta che la usa, ma se specifichi perché non è adatta, forse qualcuno potrebbe trovare una risposta che stai cercando.

library(ggplot2) 
library(plyr) 

mydata = mydata[,c(3,4)] #drop unnecessary variables 
data.m = melt(table(mydata)) #get counts and melt it 

#calculate percentage: 
m1 = ddply(data.m, .(week), summarize, ratio=value/sum(value)) 

#order data frame (needed to comply with percentage column): 
m2 = data.m[order(data.m$week),] 

#combine them: 
mydf = data.frame(m2,ratio=m1$ratio) 

Che ci dà la seguente struttura di dati. La colonna ratio contiene la frequenza relativa di rank specificata all'interno di week specificata (quindi è possibile vedere che rank == 3 è due volte più abbondante delle altre due).

> mydf 
    week rank value ratio 
1 w1 1  1 0.25 
4 w1 2  1 0.25 
7 w1 3  2 0.50 
2 w2 1  1 0.25 
5 w2 2  1 0.25 
8 w2 3  2 0.50 
3 w3 1  1 0.25 
6 w3 2  1 0.25 
9 w3 3  2 0.50 

Successivamente, dobbiamo calcolare la posizione delle etichette percentuali e tracciarlo.

#get positions of percentage labels: 
mydf = ddply(mydf, .(week), transform, position = cumsum(value) - 0.5*value) 

#make plot 
p = 
ggplot(mydf,aes(x = week, y = value, fill = as.factor(rank))) + 
    geom_bar(stat = "identity") 

#add percentage labels using positions defined previously 
p + geom_text(aes(label = sprintf("%1.2f%%", 100*ratio), y = position)) 

È questo che volevi?

enter image description here