堆积在条形图旁边,在y轴上具有百分比

时间:2013-05-23 11:59:30

标签: r ggplot2

我在R中有一个〜7000行的数据帧。显示了10行我的数据框 -

TypeA   TypeB   Ct_for_typeA    Ct_for_typeB
code3   code2   m               n
code4   code1   m               p
code3   code7   p               n
code8   code6   n               n
code1   code3   m               p
code5   code8   n               o
code2   code1   o               p
code5   code5   p               m
code7   code4   o               m
code6   code1   m               o

第1列(TypeA)和第2列(TypeB)有8个不同的代码,从code1到code8。第3列和第4列有4个不同的类别,即m,n,o和p。我想在x轴上绘制一个带有code1到code8的条形图,在y轴上绘制“百分比”。这意味着x轴将具有8对条形,y轴将显示代码的百分比,并且我想根据第3列(第1列)和第4列(第2列)将每个条分成不同的颜色堆栈。例如:

仅考虑x轴上的第一对代码,即code1。从10行以上,我们可以看到“TypeA”中的code1为10%,而“TypeB”中的code1为30%。所以第一对有第一根直到10%,第二对直到30%。现在,根据第3列,第一对的第一个条将被分割(堆叠颜色)。我们可以看到只有“m”代码为1,颜色将为“m”(整数为10%),但对于“TypeB”中的代码1,即第一对的第二个条将被分为20%,颜色为“p”和10%的颜色“o”。

我尝试使用“旁边= F”堆叠颜色并且它正在工作。这意味着如果我只有第1列和第3列,我可以轻松完成。但包括第二和第四列的第二个栏令我困惑。 我希望我的解释不会令人困惑。提前谢谢。

编辑:在Thomas的评论之后。

如果“my_frame”是超过10行的数据帧。对于具有堆叠颜色的单变量,我使用了 -

px=ggplot(my_frame,aes(x=TypeA,fill=Ct_for_typeA))+geom_bar()
print(px)

首先,在这里,我没有得到y轴上的百分比,其次我怎么能把“旁边”栏放在第二列,堆叠的颜色在第四列。

1 个答案:

答案 0 :(得分:0)

目前,您展示了广泛的数据格式。这意味着每个变量都是一列。 ggplot相当喜欢长格式。

要在数据框中进行计数,您可以使用data.table包。由于您的姓名代码被称为相同,因此您无法轻松使用reshape2包中的melt函数。因此绕道而行data.table

library(data.table)
test.df <- read.table("your.data", header=T, sep='\t')

# create a data table
test.dt <- as.data.table(test.df)

# here it would be possible to use melt, if your "codes" wouldn't be named identical

# count TypeA
 test.a.count.dt <- test.dt[, length(Ct_for_typeA), by="TypeA" ]
 test.a.count.dt
    TypeA V1
1: code1  1
2: code2  1
3: code3  2
4: code4  1
5: code5  2
6: code6  1
7: code7  1
8: code8  1

# do the same for TypeB
test.b.count.dt <- test.dt[, length(Ct_for_typeB), by="TypeB" ]

colnames(test.a.count.dt) <- c("code","count")
colnames(test.b.count.dt) <- c("code","count")

test.a.count.dt$type <- "TypeA"
test.b.count.dt$type <- "TypeB"


# fuse the two data sets
# this is a long data format that suits ggplot better
test.all.count.dt <- rbind(test.a.count.dt, test.b.count.dt)

colnames(test.all.count.dt) <- c("code","count","type")

# this can be plotted already, but it isn't relative
ggplot(data=test.all.count.dt, aes(code, count, fill=type)) + geom_bar(stat="identity", position="dodge")

# the detour to get relative counts
test.all.count.dt$relative <- apply(test.all.count.dt, 1, function(x){
 count<-x[2];
 type<-x[3];
 return(as.numeric(count)/sum(test.all.count.dt$type==type))
})

# finally plot your relative counts
ggplot(data=test.all.count.dt, aes(code, relative, fill=type)) +
  geom_bar(stat="identity", position="dodge")

ggplot&#39; s geom_bar已经采用stat=count方法,但这只会绘制绝对数据。我无法找到直接使geom_bar返回相对值的方法。