0

我在 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”中为 30%。所以第一对有第一条直到 10% 和第二条直到 30%。现在将根据第 3 列划分第一对的第一条(堆叠颜色)。我们可以看到只有“m”和code1,颜色将是“m”(全部10%)但是对于“TypeB”中的code1,即第一对的第二条将被分成20%,颜色为“p”和 10% 的颜色为“o”。

我尝试用“beside = F”堆叠颜色并且它正在工作。这意味着如果我只有第一列和第三列,我可以轻松完成。但是包括第 2 列和第 4 列的第二条让我感到困惑。我希望我的解释不会令人困惑。提前致谢。

编辑:在托马斯发表评论之后。

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

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

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

4

1 回答 1

0

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

要在数据框中计数,您可以使用data.table包。由于您的名称(又名代码)被称为相同,因此您无法轻松使用meltreshape2 包中的函数。因此绕道而行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")

ggplotgeom_bar已经具有一种stat=count方法,但这仅绘制绝对数据。我找不到直接geom_bar返回相对值的方法。

于 2016-03-14T17:43:57.623 回答