2013-08-20 7 views
5

Oto moje uproszczone dane:jak umieścić etykietę procentową w ggplot, gdy geom_text nie jest odpowiedni?

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",] 

A, kod R użyłem:

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

Na działce bar, chcę oznaczyć procent w tygodniu, przez rangi. Problem polega na tym, że dane nie mają procentu rangi. A struktura tych danych nie nadaje się do tego. (oczywiście oryginalne dane mają o wiele więcej obserwacji niż w przykładzie).

Czy jest ktoś, kto może mnie nauczyć Jak mogę oznaczyć procent na tym wykresie?

Odpowiedz

15

Nie jestem pewien, czy rozumiem, dlaczego geom_text nie jest odpowiedni. Oto odpowiedź na to pytanie, ale jeśli określisz, dlaczego nie jest odpowiednia, być może ktoś może wymyślić odpowiedź, której szukasz.

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) 

Co daje nam następującą strukturę danych. Kolumna ratio zawiera względną częstotliwość podaną rank w podanym week (tak można zobaczyć, że rank == 3 jest dwa razy tak obfite, jak dwa pozostałe).

> 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 

Następnie musimy obliczyć pozycję etykiet procentowych i narysować go.

#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)) 

Czy tego właśnie chcesz?

enter image description here

Powiązane problemy