2012-06-08 7 views
15

Ich habe herumgestochert, konnte aber keine Antwort finden. Ich möchte ein gewichtetes geom_bar-Diagramm erstellen, das mit einer vertikalen Linie überlagert ist, die den gewichteten Durchschnittswert pro Facette angibt. Ich kann das nicht passieren. Die vertikale Linie scheint auf alle Facetten einen einzelnen Wert anzuwenden.Wie bekomme ich geom_vline um facet_wrap zu ehren?

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

Antwort

21

Wenn Sie in den presumarized Daten passieren, scheint es zu funktionieren:

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