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


68

我有一个像这样的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(as.matrix(df))

有什么帮助吗?

Answers:


118

ggplot除了到目前为止,您还可以使用该软件包(3.x版)解决方案。

我们使用set的position参数。如果要使用(和)的参数,也可以使用。geom_barposition = "fill"position = position_fill()position_fill()vjustreverse

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

library(ggplot2)
library(dplyr)
library(tidyr)

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 and reshape
datm <- dat %>% 
  mutate(ind = factor(row_number()) %>% 
  gather(variable, value, -ind)

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 = scales::percent_format())

在此处输入图片说明


1
熔化()部分是什么包装?是reshape2吗?
朱利奥·迪亚兹

3
是; 我很抱歉。这么长的一段时间,ggplot2自己加载了那些软件包,我已经生锈了。
joran 2012年

我使用了重塑包中的melt尝试了它,但收到以下错误:“ scale $ labels(breaks)中的错误:未使用的参数(breaks)”我想知道是否是因为我正在从csv中读取。
朱利奥·迪亚兹

@JulioDiaz嗯。很难说这是怎么回事,尤其是当您正在使用的数据与问题中的示例不完全相同时。我会确保所有软件包都是最新的,并且您使用的是R 2.14.2(我必须升级到2.14.2才能使ggplot 0.9.0中的某些内容正常工作)。
joran 2012年

7
对于那些在2018年之后来到这里的用户,将“ labels = percent_format()”替换为“ scales :: percent”。
斯图尔特·史蒂文森'18

19

克里斯·贝利(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) )

给出:

在此处输入图片说明


1
这应该是公认的答案。真的很简单,很简单。
kboom

@kboom并没有使用ggplot2OP来标记他的问题
Jabro

14

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

5

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

这样做就足够了:

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

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


您好,这并没有安静地调整我的数据,rowSums(data.perc)不是每行1。相反,我使用了:data.perc <- apply(data, 2, function(x){x/(apply(data,1,sum))})
3nrique0

您有NA或零加总行吗?否则,我不太明白为什么这行不通……
nico
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.