2015-12-30 18 views
5

Khi sử dụng ggplot2 để tạo các ô mặt, tôi gặp sự cố khi nhận từng nhãn riêng lẻ trong mỗi khía cạnh khi tôi cũng chỉ định tham số nhóm. Nếu không chỉ định group = ..., mọi thứ hoạt động tốt, nhưng tôi đang cố gắng tạo ra các lô dữ liệu ghép nối nhấn mạnh các thay đổi trước và sau khi điều trị.geom_text với facet_wrap trong ggplot2 khi nhóm được chỉ định

Dưới đây là một ví dụ:

library(tidyr) 
library(ggplot2) 

set.seed(253) 
data <- data.frame(Subject = LETTERS[1:10], 
        Day1.CompoundA = rnorm(10, 4, 2), 
        Day2.CompoundA = rnorm(10, 7, 2), 
        Day1.CompoundB = rnorm(10, 5, 2), 
        Day2.CompoundB = rnorm(10, 5.5, 2)) 

# Compare concentration of compounds by day 
A <- t.test(data$Day1.CompoundA, data$Day2.CompoundA, paired = TRUE) 
B <- t.test(data$Day1.CompoundB, data$Day2.CompoundB, paired = TRUE) 

data.long <- gather(data, key = DayCompound, value = Concentration, -Subject) %>% 
     separate(DayCompound, c("Day", "Compound")) 

# text to annotate graphs 
graphLabels <- data.frame(Compound = c("CompoundA", "CompoundB"), 
          Pval = paste("p =", c(signif(A$p.value, 2), 
               signif(B$p.value, 2)))) 

Ok, bây giờ mà các dữ liệu được thiết lập, tôi có thể làm cho một boxplot tốt:

ggplot(data.long, aes(x = Day, y = Concentration)) + 
     geom_boxplot() + 
     facet_wrap(~ Compound) + 
     geom_text(data = graphLabels, aes(x = 1.5, y = 10, label = Pval)) 

boxplot example

Nhưng nếu tôi muốn để hiển thị các ô dòng nhấn mạnh tính chất ghép nối của dữ liệu bằng cách hiển thị từng đối tượng theo một màu khác nhau, các nhãn khía cạnh không hoạt động.

ggplot(data.long, aes(x = Day, y = Concentration, color = Subject, group = Subject)) + 
     geom_point() + geom_line() + 
     facet_wrap(~ Compound) + 
     geom_text(data = graphLabels, aes(x = 1.5, y = 10, label = Pval)) 

# Error in eval(expr, envir, enclos) : object 'Subject' not found 

Mọi đề xuất?

Trả lời

8

Khi bạn vẽ bản đồ thẩm mỹ (ví dụ: aes(...,color = Subject)) ở cấp cao nhất, các ánh xạ đó được chuyển đến từng lớp, nghĩa là mỗi lớp mong muốn dữ liệu có các biến theo tên đó.

Bạn có thể cần phải xác định dữ liệu và lập bản đồ riêng trong mỗi lớp, hoặc unmap họ một cách rõ ràng:

ggplot(data.long, aes(x = Day, y = Concentration, color = Subject, group = Subject)) + 
    geom_point() + geom_line() + 
    facet_wrap(~ Compound) + 
    geom_text(data = graphLabels, aes(x = 1.5, y = 10, label = Pval,color = NULL,group= NULL)) 

Ngoài ra còn có một inherit.aes luận rằng bạn có thể thiết lập để FALSE trong bất kỳ lớp nào bạn không muốn kéo vào các ánh xạ khác, vd

ggplot(data.long, aes(x = Day, y = Concentration, color = Subject, group = Subject)) + 
    geom_point() + geom_line() + 
    facet_wrap(~ Compound) + 
    geom_text(data = graphLabels, aes(x = 1.5, y = 10, label = Pval),inherit.aes = FALSE) 
+0

Cảm ơn bạn! Điều đó làm việc rất đẹp! – LauraS

Các vấn đề liên quan