创build堆叠的barplot,其中每个堆栈被缩放到总和为100%

我有这样的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制作): 在这里输入图像描述

因此,酒吧应该标准化,所有的堆栈有相同的高度和总和为100%。 到目前为止,我所能得到的是一个堆叠的barplot(不是百分比),使用:

 barplot(as.matrix(df)) 

任何帮助?

既然你用ggplot2标记了这个,除了你已经得到的东西外,这里还有一个使用这个包(版本0.9.0)的解决scheme。

我们使用geom_barposition参数设置position = "fill" 。 如果你想使用position_fill()vjustreverse )的参数,你也可以使用position = position_fill() )。

请注意,您的数据是“宽”格式,而ggplot2要求它是“长”格式。 因此,我们首先需要对数据进行melt

 dat <- read.table(text = " ONE TWO THREE 1 23 234 324 2 34 534 12 3 56 324 124 4 34 234 124 5 123 534 654",sep = "",header = TRUE) #Add an id variable for the filled regions library(reshape) datm <- melt(cbind(dat, ind = rownames(dat)), id.vars = c('ind')) library(scales) ggplot(datm,aes(x = variable, y = value,fill = ind)) + geom_bar(position = "fill",stat = "identity") + # or: # geom_bar(position = position_fill(), stat = "identity") scale_y_continuous(labels = percent_format()) 

在这里输入图像描述

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 

克里斯·比利是好的,你只需要按比例列。 使用你的数据是:

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

得到:

在这里输入图像描述

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

这样做应该足够了:

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

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