2013-05-19 40 views
11

Tôi đang cố gắng đặt các thanh lỗi vào đúng vị trí trên một thanh xếp chồng lên nhau. Như tôi đã đọc trên một bài trước đó, tôi đã sử dụng ddply để ngăn xếp các thanh lỗi. Sau đó, thay đổi thứ tự của xếp chồng nên tôi đã ra lệnh cho yếu tố. Bây giờ nó xuất hiện các thanh lỗi là chính xác trên một tập hợp các thanh nhưng không phải là khác. Những gì tôi muốn là một đồ thị trông giống như bên dưới, chỉ với lỗi tiêu chuẩn được hiển thị với các thanh lỗi. Tôi đang liệt kê dput của dữ liệu gốc và dữ liệu ddply cũng như tập dữ liệu. enter image description hereThanh lỗi trên thanh xếp chồng lên nhau ggplot2

Suz2$org <- factor(Suz2$org, levels = c('fungi','bacteria'),ordered = TRUE) 

library(plyr) 
plydat <- ddply(Suz2,.(org, group, time),transform,ybegin = copy - se,yend = copy + se) 

colvec <-c("blue", "orange") 

ggplot(plydat, aes(time, copy)) + 
    geom_bar(aes(fill = factor(org)), stat="identity", width = 0.7) + 
    scale_fill_manual(values = colvec) + 
    facet_wrap(~group,nrow = 1)+ 
    geom_errorbar(aes(ymax=ybegin , ymin= yend),width=.5) + 
    theme(panel.background = element_rect(fill='white', colour='white'), 
     panel.grid = element_line(color = NA), 
     panel.grid.minor = element_line(color = NA), 
     panel.border = element_rect(fill = NA, color = "black"), 
     axis.text.x = element_text(size=10, colour="black", face = "bold"), 
     axis.title.x = element_text(vjust=0.1, face = "bold"), 
     axis.text.y = element_text(size=12, colour="black"), 
     axis.title.y = element_text(vjust=0.2, size = 12, face = "bold")) 

dput (plydat)

structure(list(org = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("fungi", "bacteria" 
), class = c("ordered", "factor")), time = structure(c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("0W", 
"6W"), class = "factor"), copy = c(97800000, 15500000, 40200000, 
10400000, 55100000, 14300000, 1.6e+07, 8640000, 2.98e+08, 77900000, 
2.33e+08, 2.2e+08, 3.37e+08, 88400000, 3.24e+08, 1.89e+08), group = structure(c(3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L), .Label = c("Native D0", 
"Native D707", "Notill D0", "Notill D707"), class = "factor"), 
    se = c(11100000, 2810000, 7110000, 2910000, 1.7e+07, 1500000, 
    1930000, 2980000, 43900000, 20100000, 56400000, 41200000, 
    75700000, 22500000, 57500000, 28100000), ybegin = c(86700000, 
    12690000, 33090000, 7490000, 38100000, 12800000, 14070000, 
    5660000, 254100000, 57800000, 176600000, 178800000, 261300000, 
    65900000, 266500000, 160900000), yend = c(108900000, 18310000, 
    47310000, 13310000, 72100000, 15800000, 17930000, 11620000, 
    341900000, 9.8e+07, 289400000, 261200000, 412700000, 110900000, 
    381500000, 217100000)), .Names = c("org", "time", "copy", 
"group", "se", "ybegin", "yend"), row.names = c(NA, -16L), class = "data.frame") 

dput (Suz2)

structure(list(org = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("fungi", "bacteria" 
), class = c("ordered", "factor")), time = structure(c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("0W", 
"6W"), class = "factor"), copy = c(97800000, 15500000, 40200000, 
10400000, 55100000, 14300000, 1.6e+07, 8640000, 2.98e+08, 77900000, 
2.33e+08, 2.2e+08, 3.37e+08, 88400000, 3.24e+08, 1.89e+08), group = structure(c(3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L), .Label = c("Native D0", 
"Native D707", "Notill D0", "Notill D707"), class = "factor"), 
    se = c(11100000, 2810000, 7110000, 2910000, 1.7e+07, 1500000, 
    1930000, 2980000, 43900000, 20100000, 56400000, 41200000, 
    75700000, 22500000, 57500000, 28100000)), .Names = c("org", 
"time", "copy", "group", "se"), row.names = c(NA, -16L), class = "data.frame") 

Suz2

org time  copy  group  se 
1  fungi 0W 9.78e+07 Notill D0 11100000 
2  fungi 0W 1.55e+07 Notill D707 2810000 
3  fungi 0W 4.02e+07 Native D0 7110000 
4  fungi 0W 1.04e+07 Native D707 2910000 
5  fungi 6W 5.51e+07 Notill D0 17000000 
6  fungi 6W 1.43e+07 Notill D707 1500000 
7  fungi 6W 1.60e+07 Native D0 1930000 
8  fungi 6W 8.64e+06 Native D707 2980000 
9 bacteria 0W 2.98e+08 Notill D0 43900000 
10 bacteria 0W 7.79e+07 Notill D707 20100000 
11 bacteria 0W 2.33e+08 Native D0 56400000 
12 bacteria 0W 2.20e+08 Native D707 41200000 
13 bacteria 6W 3.37e+08 Notill D0 75700000 
14 bacteria 6W 8.84e+07 Notill D707 22500000 
15 bacteria 6W 3.24e+08 Native D0 57500000 
16 bacteria 6W 1.89e+08 Native D707 28100000 
+3

+1 cho câu hỏi chi tiết, trong đó có một ví dụ tái sản xuất. –

+3

Trong khi sử dụng barplot cho dữ liệu không phải là đếm về cơ bản là sai và cho mỗi barplot bạn vẽ (với thanh lỗi), một con chó con dễ thương và/hoặc con mèo con chết, tôi upvoting vì một câu hỏi cũng được hình thành và tái sản xuất ví dụ. –

Trả lời

10

Các giá trị cho cả ybeginyend, phạm vi của thanh lỗi, quá thấp đối với dữ liệu bacteria. Vì các thanh cho bacteria nằm ở trên cùng của các thanh fungi, chiều cao của các thanh fungi (plydat$copy[plydat$org == "fungi"]) phải được thêm vào các giá trị lỗi của dữ liệu bacteria.

plydat[plydat$org == "bacteria", ] 
    <- transform(plydat[plydat$org == "bacteria", ], 
       ybegin = ybegin + plydat[plydat$org == "fungi", "copy"], 
       yend = yend + plydat[plydat$org == "fungi", "copy"]) 

enter image description here

+1

+1 mặc dù tôi không phải là một fan hâm mộ lớn của barcharts xếp chồng lên nhau, xem câu trả lời của tôi cho một thay thế. –

9

Cá nhân, tôi không thực sự thích một biểu đồ thanh xếp chồng lên nhau, đặc biệt là khi số lượng các cột trụ lớn (mà không phải là trường hợp của bạn). Vấn đề chính là thực tế rằng tất cả nhưng ngăn xếp thấp nhất không chia sẻ cùng một đường cơ sở. Trong trường hợp của bạn, rất khó để so sánh lớp màu cam bacteria vì chúng không có cùng một cơ sở (giá trị y, copy).

tôi đề xuất sử dụng một âm mưu gọi là dotplot:

library(ggplot2) 
theme_set(theme_bw()) 
ggplot(plydat, aes(time, copy, color = org)) + 
    geom_point() + facet_wrap(~group, ncol = 1) + 
    geom_errorbar(aes(ymax=ybegin , ymin= yend), width = 0) + coord_flip() 

enter image description here

Lưu ý rằng giá trị copy không phải là phụ ở đây vì nó là trong barchart xếp chồng lên nhau. Bởi vì chúng có cùng giá trị copy cơ sở (0), bạn có thể dễ dàng so sánh giữa các giá trị khác nhau của bacteria. Ngoài ra, tôi hoán đổi trục x và y để dễ so sánh giá trị của copy (chỉ cần loại bỏ coord_flip để xem mức độ hoạt động của nó kém so với copy).

Nhược điểm thực sự duy nhất là không có cách nào dễ dàng để đánh giá tổng số fungibacteria. Tùy thuộc vào những gì biểu đồ có nghĩa là để hiển thị (câu chuyện của biểu đồ) điều này có thể hoặc không có thể là một vấn đề. Bạn có thể thêm danh mục bổ sung riêng biệt vào org, tức là both là tổng của cả hai danh mục, để khắc phục điều này. Tất nhiên, việc giải thích lỗi trong danh mục được tổng hợp này là không tầm thường.

3

Từ sự kết hợp của các câu trả lời ở trên, tôi nghĩ rằng tôi sẽ đi với một cái gì đó như thế này.

plydat <- ddply(Suz2,.(org),transform,ybegin = copy - se,yend = copy + se) 

colvec <-c("blue", "orange") 

ggplot(plydat, aes(time, copy, color = factor(org))) + 
    geom_point(size = 3.5) + facet_wrap(~group, ncol = 4) + 
    scale_color_manual(values = colvec) + 
    geom_errorbar(aes(ymax=ybegin , ymin= yend), width = 0.08, 
     color = "black", size = 0.1) + 
    theme(panel.background = element_rect(fill='white', colour='white'), 
     panel.grid = element_line(color = NA), 
     panel.grid.minor = element_line(color = NA), 
     panel.border = element_rect(fill = NA, color = "black"), 
     strip.background = element_blank(), 
     axis.text.x = element_text(size=10, colour="black", face = "bold"), 
     axis.title.x = element_text(vjust=0.1, face = "bold"), 
     axis.text.y = element_text(size=12, colour="black"), 
     axis.title.y = element_text(vjust=0.2, size = 12, face = "bold")) 

enter image description here