我在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轴上的百分比,其次我怎么能把“旁边”栏放在第二列,堆叠的颜色在第四列。
答案 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
返回相对值的方法。