创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_bar
的position
参数设置position = "fill"
。 如果你想使用position_fill()
( vjust
和reverse
)的参数,你也可以使用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,您将它应用于行)。 然后,匿名函数每次传递一个数据列。