2013-02-18 53 views
8

Tôi đang cố vẽ đồ thị thanh xếp chồng lên nhau trong R bằng ggplot. Tôi cũng muốn bao gồm tỷ lệ phần trăm trong mỗi phần của thanh cho phần đó. Tôi đã cố gắng theo dõi các bài đăng 1, 2, 3 nhưng các giá trị không chính xác trong các khối tương ứng của chúng. Dữ liệu của tôi là một tệp trong dropbox.R biểu đồ thanh xếp chồng lên nhau vẽ sơ đồ geom_text

Mã của tôi là như sau:

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") 

Sản lượng là-

enter image description here

Any help is appreciated rất nhiều. Cảm ơn sự giúp đỡ và thời gian của bạn!

+5

Hãy nghĩ về những giá trị y bạn đang đem lại cho 'geom_text'. Đây là _height_ của mỗi đoạn thanh. Bạn cần phải thực hiện một số phép tính để tính điểm giữa (hoặc trên cùng hoặc bất kỳ phần nào) của mỗi đoạn thanh, thêm nó như là một biến riêng biệt và sử dụng nó làm biến y trong 'geom_text'. Hàm 'cumsum' có thể hữu ích. – joran

+1

Một cái gì đó như thế này sẽ tính toán vị trí y cho các nhãn ở trung điểm của mỗi đoạn thanh: 'f <- ddply (f,. (Mẫu, Sample_name, Sample_type), biến đổi, pos = (cumsum (Tỷ lệ phần trăm) - 0,5 * Tỷ lệ phần trăm)) '(yêu cầu plyr), sau đó câu lệnh' geom_text' phải là: 'geom_text (aes (x = Biểu mẫu, y = pos, nhãn = Tỷ lệ phần trăm))' –

Trả lời

9

Tôi nghĩ bạn đang sử dụng phiên bản cũ hơn của ggplot2. Bởi vì với mã của bạn sửa đổi cho ggplot2 v 0.9.3, tôi có được điều này:

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

Bạn thấy rằng các đối tượng văn bản được đặt bình thường đúng. Có những nơi mà các thanh chỉ là quá ngắn để các con số chồng lên nhau. Bạn cũng có thể chơi với thông số size.

Để khắc phục điều đó, bạn có thể làm một việc như thế này để tự mình thêm số.

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 

Điều này cho phép:

ggplot2_facet_text_final

5

Dưới đây là một giải pháp sử dụng barchart từ mạng.

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()) 
Các vấn đề liên quan