2013-02-18 195 views
8

我想绘制使用ggplot在R中堆积的条形图。我还希望在每件酒吧中包含百分比。我试图按照文章1,2,3,但值不完全在其各自的块。我的数据是dropbox中的文件。R堆积的条形图绘制geom_text

我的代码如下:

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值。它是每个酒吧段的_height_。您需要进行一些算术运算来计算每个线段的中点(或顶点或其他),将其作为单独的变量添加,并将其用作'geom_text'中的y变量。函数'cumsum'可能会有所帮助。 – joran 2013-02-18 17:35:51

+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))' – 2013-02-18 21:02:00

回答

9

我想你使用的是旧版本的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

这里使用莱迪思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())