2012-06-08 25 views
15

Tôi đã poked xung quanh, nhưng không thể tìm thấy câu trả lời. Tôi muốn làm một cốt truyện geom_bar có trọng số phủ lên một đường thẳng đứng cho thấy tổng trọng số trung bình trên mỗi khía cạnh. Tôi không thể thực hiện điều này. Đường thẳng đứng dường như là một giá trị duy nhất được áp dụng cho tất cả các khía cạnh.Làm thế nào để có được geom_vline để tôn vinh facet_wrap?

require('ggplot2') 
require('plyr') 

# data vectors 
panel <- c("A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B") 
instrument <-c("V1","V2","V1","V1","V1","V2","V1","V1","V2","V1","V1","V2","V1","V1","V2","V1") 
cost <- c(1,4,1.5,1,4,4,1,2,1.5,1,2,1.5,2,1.5,1,2) 
sensitivity <- c(3,5,2,5,5,1,1,2,3,4,3,2,1,3,1,2) 

# put an initial data frame together 
mydata <- data.frame(panel, instrument, cost, sensitivity) 

# add a "contribution to" vector to the data frame: contribution of each instrument 
# to the panel's weighted average sensitivity. 
myfunc <- function(cost, sensitivity) { 
    return(cost*sensitivity/sum(cost)) 
} 
mydata <- ddply(mydata, .(panel), transform, contrib=myfunc(cost, sensitivity)) 

# two views of each panels weighted average; should be the same numbers either way 
ddply(mydata, c("panel"), summarize, wavg=weighted.mean(sensitivity, cost)) 
ddply(mydata, c("panel"), summarize, wavg2=sum(contrib)) 

# plot where each panel is getting its overall cost-weighted sensitivity from. Also 
# put each panel's weighted average on the plot as a simple vertical line. 
# 
# PROBLEM! I don't know how to get geom_vline to honor the facet breakdown. It 
#   seems to be computing it overall the data and showing the resulting 
#   value identically in each facet plot. 
ggplot(mydata, aes(x=sensitivity, weight=contrib)) + 
    geom_bar(binwidth=1) + 
    geom_vline(xintercept=sum(contrib)) + 
    facet_wrap(~ panel) + 
    ylab("contrib") 

Trả lời

21

Nếu bạn vượt qua trong các dữ liệu presumarized, có vẻ như để làm việc:

ggplot(mydata, aes(x=sensitivity, weight=contrib)) + 
    geom_bar(binwidth=1) + 
    geom_vline(data = ddply(mydata, "panel", summarize, wavg = sum(contrib)), aes(xintercept=wavg)) + 
    facet_wrap(~ panel) + 
    ylab("contrib") + 
    theme_bw() 

enter image description here

3
vlines <- ddply(mydata, .(panel), summarize, sumc = sum(contrib)) 
ggplot(merge(mydata, vlines), aes(sensitivity, weight = contrib)) + 
geom_bar(binwidth = 1) + geom_vline(aes(xintercept = sumc)) + 
facet_wrap(~panel) + ylab("contrib") 
Các vấn đề liên quan