如何使用facet_wrap绘制ggplot2,显示每组的百分比,而不是整体百分比?

时间:2015-05-14 09:18:47

标签: r ggplot2 percentage facet

我想绘制一个带有facet_wrap的ggplot,它不会显示实际的表百分比,而是显示每组中给定答案的百分比。我必须这样做,因为我想表明,哪个答案选择最多,每个组最重要。这些团体的规模不一样。

示例数据:

group <- c(rep(c("Group1"), times = 10),rep(c("Group2"), times = 6),rep(c("Group3"), times = 4))
choice <- c(rep(c("a","b","c"),length.out = 10), "a","a","a","a","b","c","b","b","b","c")
df <- data.frame(cbind(group,choice))

如果我不能使用整体prop.t,但prop.c显示在我的情节中,那将是很好的,因为重要的是要显示,例如,第2组中66.67%的人更喜欢选择一个。

library(gmodels)
CrossTable(choice, group, prop.chisq=FALSE, prop.t = TRUE, prop.c = TRUE, prop.r = FALSE, format = "SPSS")

这是为了情节:

library(ggplot2)
g <- ggplot(df, aes_string(x="group", fill="group")) +
            geom_bar(aes(y = (..count..)/sum(..count..)))+
            ylab("percent")
g + facet_wrap(~ choice)

This is how it looks so far

现在第一个酒吧节目:20%,20%,0%,但应该显示40%,66.67%和0%(组中每个人的百分比,谁给出了这个答案)。

对于第二个栏应该显示:30%,16.667%和75%。

和第三个栏:30%,16.667%和25%

感谢您的帮助。

1 个答案:

答案 0 :(得分:10)

事先计算百分比可能更好:

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e){

        GridViewRow row = e.Row;
        // Intitialize TableCell list
        List<TableCell> columns = new List<TableCell>();
        foreach (DataControlField column in GridView1.Columns)
        {
            if (row.Cells.Count > 0)
            {
            //Get the first Cell /Column
            TableCell cell = row.Cells[0];
            // Then Remove it after
            row.Cells.Remove(cell);
            //And Add it to the List Collections
            columns.Add(cell);
            }
        }

        // Add cells
        row.Cells.AddRange(columns.ToArray());
}

这给出了: enter image description here

另一种(可能更好)呈现数据的方式是按组使用构面:

library(dplyr)
dfl <- df %>% 
  group_by(group,choice) %>% 
  summarise(n=n()) %>% 
  group_by(group) %>% 
  mutate(perc=100*n/sum(n))

ggplot(dfl, aes(x=group, y=perc, fill=group)) +
  geom_bar(stat="identity") +
  ylab("percent") + 
  facet_wrap(~ choice)

这给出了: enter image description here