【问题标题】:How to get geom_vline to honor facet_wrap?如何让 geom_vline 尊重 facet_wrap?
【发布时间】:2012-06-08 02:29:57
【问题描述】:

我四处寻找,但找不到答案。我想做一个加权 geom_bar 图,上面覆盖着一条垂直线,显示每个方面的总体加权平均值。我无法做到这一点。垂直线似乎将单个值应用于所有方面。

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

【问题讨论】:

  • 我的 x 轴是一个因素,我的 x 轴无法正常工作。花了一段时间才明白为什么它没有出现。

标签: r ggplot2


【解决方案1】:

如果你传入预先汇总的数据,它似乎可以工作:

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

【讨论】:

    【解决方案2】:

    使用 dplyr 和 facet_wrap 的示例以防万一。

    library(dplyr)
    library(ggplot2)
    
    df1 <- mutate(iris, Big.Petal = Petal.Length > 4)
    df2 <- df1 %>%
      group_by(Species, Big.Petal) %>%
      summarise(Mean.SL = mean(Sepal.Length))
    
    ggplot() +
      geom_histogram(data = df1, aes(x = Sepal.Length, y = ..density..)) +
      geom_vline(data = df2, mapping = aes(xintercept = Mean.SL)) +
      facet_wrap(Species ~ Big.Petal) 
    

    【讨论】:

    • 很好的答案。在每个情节中制作> 1行怎么样?所以 xintercept 将由多个列组成
    【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 2015-09-26
      • 2017-07-13
      • 2018-11-18
      • 2013-06-30
      • 2012-09-04
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多