【问题标题】:ggplot2 with fill and group带有填充和组的ggplot2
【发布时间】:2014-02-10 06:02:33
【问题描述】:

我在使用 facet_wrap 分组时遇到问题 使用这个data.frame:

library(ggplot2)
library(gridExtra)
set.seed(1234)
testDat <- data.frame(answer=factor(sample(c("yes", "no"), 60, replace=TRUE)),
                      which=factor(sample(c("q1", "q2", "q3"), 60, replace=TRUE)))

我想绘制按变量 which 分组的答案。这给了我绝对值:

ggplot(testDat, aes(x=answer)) + 
  geom_bar(aes(fill=answer)) + facet_wrap(~which)

这给了我相对值。但不是每组:

ggplot(testDat, aes(x=answer)) + 
  geom_bar(aes(y=(..count..)/sum(..count..), fill=answer)) + facet_wrap(~which)

在寻找答案时,我检测到这一点以绘制每组的相对值。但是填充颜色不再起作用了

ggplot(testDat, aes(x=answer)) + 
  geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=answer)) + facet_wrap(~which)

它只适用于 'which' 而不是 'answer' 的三个不同值

ggplot(testDat, aes(x=answer)) + 
  geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=which)) + facet_wrap(~which)

对如何填充这些条有任何建议吗?

p1<-ggplot(testDat, aes(x=answer)) + geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=answer)) + facet_wrap(~which)
p2<-ggplot(testDat, aes(x=answer)) + geom_bar(aes(y=(..count..)/sum(..count..), group=which, fill=which)) + facet_wrap(~which)
grid.arrange(p1,p2)

【问题讨论】:

    标签: r colors ggplot2 grouping


    【解决方案1】:

    这是你的想法吗?

    library(reshape2)
    library(ggplot2)
    df <- aggregate(answer~which,testDat,
                    function(x)c(yes=sum(x=="yes")/length(x),no=sum(x=="no")/length(x)))
    df <- data.frame(which=df$which, df$answer)
    gg <- melt(df,id=1, variable.name="Answer",value.name="Rel.Pct.")
    ggplot(gg) + 
      geom_bar(aes(x=Answer, y=Rel.Pct., fill=Answer),position="dodge",stat="identity")+
      facet_wrap(~which)
    

    不幸的是,sum(...), min(...), max(...), range(...) 等聚合函数在用于美学映射时,不尊重构面隐含的分组。因此,虽然..count.. 在单独使用时(在您的分子中)被正确子集化,但sum(..count..) 给出了整个数据集的总数。这就是为什么(..count..)/sum(..count..) 给出total 的分数,而不是组的分数。

    据我所知,唯一的解决方法是创建一个如上所述的腋窝表。

    【讨论】:

    • 感谢您对使用聚合函数的解释。我用..density..) 找到了解决..count../sum(..count..) 的方法。我的问题仍然是为什么fill=which 有效而fill=answer 无效。
    • 为美学映射中定义的组正确聚合函数子集(例如,在对 aes(...) 的调用中)。它们不适用于在构面中隐式定义的组。所以如果你有aes(..., fill=which)facet__wrap(~which),你在这两个地方都定义了组,它会起作用。但那是完全不同的情节。
    【解决方案2】:

    有一种方法可以按照mentioned in this question 的要求使用 ggplot 进行聚合。 但是,它需要使用PANEL variable that isn't documented therefore Hadley recomended not to use it

    这是一种使用data.table 进行聚合的方法。 我还在图中添加了百分比标签。

    grp <- function(x) {
      percentage = as.numeric(table(x)/length(x))
      list(x = levels(x),
           percentage = percentage,
           label = paste0( round( as.numeric(table(x)/length(x), 0 ) * 100 ), "%")
      )
    }
    
    require("data.table")
    DT <- data.table(testDat)
    
    # Simpler version
    ggplot(DT[, grp(answer), by=which]) +
      geom_bar(aes(x=x, y=percentage, fill = x), position="dodge",stat="identity") +
      facet_grid(~which) + 
      xlab("Answer")
    
    # With percentage labels and y axis with percentage
    ggplot(DT[, grp(answer), by=which]) +
      geom_bar(aes(x=x, y=percentage, fill = x), position="dodge",stat="identity") +
      geom_text(aes(x=x, ymax = 0.6, y=percentage, label = label), vjust = -1.2, color = "grey20") +
      facet_grid(~which) + 
      xlab("Answer") + xlim("yes", "no") +
      scale_y_continuous(labels = percent_format()) +
      scale_fill_discrete(name = "Answer")
    

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 2017-06-05
      • 2017-04-21
      • 1970-01-01
      • 2014-10-16
      • 2021-12-25
      • 1970-01-01
      • 2018-08-30
      • 2021-11-29
      相关资源
      最近更新 更多