2012-06-08 14 views
15

Schowałem się, ale nie byłem w stanie znaleźć odpowiedzi. Chcę wykonać ważoną działkę geom_bar nałożoną na pionową linię, która pokazuje ogólną średnią ważoną dla danego aspektu. Nie mogę tego zrobić. Linia pionowa wydaje się pojedynczą wartością zastosowaną do wszystkich aspektów.Jak zdobyć geom_vline na honor 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") 

Odpowiedz

21

Jeśli przechodzą w danych presumarized, wydaje się działać:

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