创建堆叠的条形图,其中每个堆栈按比例缩放为100%

时间:2012-03-05 08:02:05

标签: r ggplot2

我有一个像这样的data.frame:

df <- read.csv(text = "ONE,TWO,THREE
                       23,234,324
                       34,534,12
                       56,324,124
                       34,234,124
                       123,534,654")

我想生成一个百分比条形图,看起来像这样(在LibreOffice Calc中制作): enter image description here

因此,条形应该标准化,以便所有堆叠具有相同的高度并且总和为100%。到目前为止,我能够得到的是一个堆积的条形图(不是百分比),使用:

barplot(as.matrix(df))

有任何帮助吗?

4 个答案:

答案 0 :(得分:95)

除了您目前所获得的内容之外,还有一个使用ggplot包(版本3.x)的解决方案。

我们使用设置为position的{​​{1}} geom_bar参数。如果您想使用position = "fill"position = position_fill()position_fill())的参数,也可以使用vjust

请注意,您的数据采用“广泛”格式,而reverse则要求采用“长”格式。因此,我们首先需要ggplot2数据。

gather

enter image description here

答案 1 :(得分:13)

prop.table是获取表格比例的友好方式。

m <- matrix(1:4,2)

 m
     [,1] [,2]
[1,]    1    3
[2,]    2    4

保证金空白为您提供整个表格的比例

 prop.table(m, margin=NULL)
     [,1] [,2]
[1,]  0.1  0.3
[2,]  0.2  0.4

给它1给你行比例

 prop.table(m, 1)
      [,1]      [,2]
[1,] 0.2500000 0.7500000
[2,] 0.3333333 0.6666667

2是列比例

 prop.table(m, 2)
          [,1]      [,2]
[1,] 0.3333333 0.4285714
[2,] 0.6666667 0.5714286

答案 2 :(得分:13)

Chris Beeley是对的,你只需按柱子的比例。使用您的数据是:

 your_matrix<-( 
               rbind(
                       c(23,234,324), 
                       c(34,534,12), 
                       c(56,324,124), 
                       c(34,234,124),
                       c(123,534,654)
                    )
                )

 barplot(prop.table(your_matrix, 2) )

给出:

enter image description here

答案 3 :(得分:4)

您只需要将每个元素除以其列中值的总和。

这样做应该足够了:

data.perc <- apply(data, 2, function(x){x/sum(x)})

请注意,第二个参数告诉apply将提供的函数应用于列(使用1将其应用于行)。然后,匿名函数每次传递一个数据列。