2013-08-20 24 views
5

Đây là dữ liệu đơn giản của tôi:cách đặt nhãn phần trăm trong ggplot khi geom_text không phù hợp?

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

Và, R mã tôi đã sử dụng:

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

Trong âm mưu thanh, tôi muốn đặt tên tỷ lệ theo tuần, theo cấp bậc. Sự cố là dữ liệu không có phần trăm xếp hạng. Và cấu trúc của dữ liệu này không phù hợp để có dữ liệu. (tất nhiên, dữ liệu gốc có nhiều quan sát hơn ví dụ)

Có ai có thể dạy tôi Làm cách nào để gắn nhãn phần trăm trong biểu đồ này không?

Trả lời

15

Tôi không chắc mình hiểu tại sao geom_text không phù hợp. Đây là một câu trả lời bằng cách sử dụng nó, nhưng nếu bạn chỉ định tại sao nó không phù hợp, có lẽ ai đó có thể đưa ra câu trả lời bạn đang tìm kiếm.

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) 

Chúng tôi cung cấp cấu trúc dữ liệu sau. Cột ratio chứa tần số tương đối của rank được chỉ định trong phạm vi được chỉ định week (vì vậy, người ta có thể thấy rằng rank == 3 là hai lần dồi dào như hai loại kia).

> 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 

Tiếp theo, chúng tôi phải tính vị trí của nhãn phần trăm và vẽ đồ thị.

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

Đây có phải là những gì bạn muốn không?

enter image description here

Các vấn đề liên quan