R堆积条形图绘制geom_text

10
我正在尝试使用ggplot在R中绘制堆积条形图。我还想为每个条的部分包括百分比。我尝试遵循这些帖子的建议123,但是值并不完全在它们各自的块中。我的数据是在dropbox上的一个文件。

我的代码如下:

f<-read.table("Input.txt", sep="\t", header=TRUE)

ggplot(data=f, aes(x=Form, y=Percentage, fill=Position)) + 
    geom_bar(stat="identity", colour="black") + 
    geom_text(position="stack", aes(x=Form, y=Percentage, ymax=Percentage, label=Percentage, hjust=0.5)) + 
    facet_grid(Sample_name ~ Sample_type, scales="free", space="free") + 
    opts(title = "Input_profile", 
         axis.text.x = theme_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
         plot.title = theme_text(face="bold", size=11), 
         axis.title.x = theme_text(face="bold", size=9), 
         axis.title.y = theme_text(face="bold", size=9, angle=90),
         panel.grid.major = theme_blank(), 
         panel.grid.minor = theme_blank()) + 
    scale_fill_hue(c=45, l=80)

ggsave("Output.pdf")

输出结果为- enter image description here 非常感谢您的帮助和时间!

5
请考虑你给 geom_text 的 y 值。它是每个条形段的高度。您需要进行一些算术计算来计算每个条形段的中点(或顶部等),将其添加为单独的变量,并将其用作 geom_text 中的 y 变量。函数 cumsum 可能会有所帮助。 - joran
1
类似这样的代码可以计算每个条形图段落中标签的y坐标:f <- ddply(f, .(Form, Sample_name, Sample_type), transform, pos = (cumsum(Percentage) - 0.5 * Percentage))(需要使用plyr库),然后geom_text语句应该是:geom_text(aes(x=Form, y=pos, label=Percentage)) - Sandy Muspratt
2个回答

11

我认为你正在使用旧版本的ggplot2。因为使用你修改过的适用于ggplot2 v 0.9.3的代码,我得到了这个结果:

p <- ggplot(data = df, aes(x = Form, y = Percentage, fill = Position))
p <- p + geom_bar(stat = "identity", colour = "black")
p <- p + geom_text(position = "stack", aes(x = Form, y = Percentage, ymax = Percentage, label = Percentage, hjust = 0.5))
p <- p + facet_grid(Sample_name ~ Sample_type, scales="free", space="free")
p <- p + theme(plot.title = element_text("Input_profile"), 
         axis.text.x = element_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
         plot.title = element_text(face="bold", size=11), 
         axis.title.x = element_text(face="bold", size=9), 
         axis.title.y = element_text(face="bold", size=9, angle=90),
         panel.grid.major = element_blank(), 
         panel.grid.minor = element_blank())
p <- p + scale_fill_hue(c=45, l=80)
p

ggplot2_text_placement

您可以看到文本对象通常被正确地放置。但是,在某些情况下,条形图太短以至于数字重叠。您还可以尝试使用size参数进行调整。

为了解决这个问题,您可以像这样手动累加数字。

df <- ddply(df, .(Form, Sample_type, Sample_name), transform, 
      cum.perc = Reduce('+', list(Percentage/2,cumsum(c(0,head(Percentage,-1))))))

p <- ggplot(data = df, aes(x = Form, y = Percentage, fill = Position))
p <- p + geom_bar(stat = "identity", colour = "black")
p <- p + geom_text(aes(x = Form, y = cum.perc, ymax = cum.perc, label = Percentage, hjust = 0.5), size=2.7)
p <- p + facet_grid(Sample_name ~ Sample_type, scales="free", space="free")
p <- p + theme(plot.title = element_text("Input_profile"), 
         axis.text.x = element_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
         plot.title = element_text(face="bold", size=11), 
         axis.title.x = element_text(face="bold", size=9), 
         axis.title.y = element_text(face="bold", size=9, angle=90),
         panel.grid.major = element_blank(), 
         panel.grid.minor = element_blank())
p <- p + scale_fill_hue(c=45, l=80)
p

这将产生:

ggplot2_facet_text_final


5

这里提供了一个使用lattice中的barchart函数的解决方案。

enter image description here

library(latticeExtra)
barchart(Percentage~Form|Sample_type*Sample_name,data=dat,
         groups =Position,stack=T,
         panel=function(...){
           panel.barchart(...)
           ll <- list(...)
           keep <- !is.na(ll$groups[ll$subscripts])
           x <- as.numeric(ll$x[keep])
           y <- as.numeric(ll$y[keep])
           groups <- as.numeric(factor(ll$groups)[ll$subscripts[keep]])
           for (i in unique(x)) {
               ok <- x == i
               ord <- sort.list(groups[ok])
               pos <- y[ok][ord] > 0
               nok <- sum(pos, na.rm = TRUE)
               h <- y[ok][ord][pos]
               panel.text(x = rep(i, nok),y = cumsum(h)-0.5*h,
                          label = h,cex=1.5)
             }
         },
         auto.key = list(columns = 5), 
         par.settings = ggplot2like(n = 5),
         lattice.options = ggplot2like.opts())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接