2015-09-12 20 views
7

Tôi đang thực hiện một số phân tích trong ggplot2 tại thời điểm này cho một dự án và tình cờ tôi gặp một số (đối với tôi) hành vi mà tôi không thể giải thích. Khi tôi viết aes(x = cyl, ...) cốt truyện trông khác với nội dung của nó nếu tôi chuyển cùng một biến bằng cách sử dụng aes(x = mtcars$cyl, ...). Khi tôi xóa facet_grid(am ~ .) cả hai biểu đồ đều giống nhau. Đoạn code dưới đây được mô hình hóa sau khi mã trong dự án của tôi mà tạo ra những hành vi tương tự:Vấn đề khi chuyển biến với ký hiệu ký hiệu đô la sang aes() kết hợp với facet_grid() hoặc facet_wrap()

library(dplyr) 
library(ggplot2) 

data = mtcars 

test.data = data %>% 
    select(-hp) 


ggplot(test.data, aes(x = test.data$cyl, y = mpg)) + 
    geom_point() + 
    facet_grid(am ~ .) + 
    labs(title="graph 1 - dollar sign notation") 

ggplot(test.data, aes(x = cyl, y = mpg)) + 
    geom_point()+ 
    facet_grid(am ~ .) + 
    labs(title="graph 2 - no dollar sign notation") 

Dưới đây là hình ảnh của biểu đồ 1: graph 1 - dollar sign notation

Dưới đây là hình ảnh của đồ thị 2: graph 2 - no dollar sign notation

Tôi thấy rằng tôi có thể giải quyết vấn đề này bằng cách sử dụng aes_string thay vì aes và chuyển các tên biến thành chuỗi, nhưng tôi muốn hiểu tại sao ggplot hoạt động theo cách đó. Vấn đề cũng xảy ra trong các nỗ lực tương tự với facet_wrap.

Thx rất nhiều để được trợ giúp trước! Tôi cảm thấy rất khó chịu nếu tôi không hiểu rằng đúng ...

+9

câu trả lời ngắn gọn là: * không bao giờ * sử dụng '$' trong 'aes()' – baptiste

+0

^_^sau cú sốc tôi nhận được hôm nay khi đồ thị của tôi đột nhiên trông kỳ lạ, tôi sẽ không làm lại. Tôi vẫn muốn hiểu những gì đang xảy ra, bởi vì tôi chưa bao giờ gặp phải vấn đề/hành vi này trước đây. – Christoph

+1

khi ggplot xây dựng cốt truyện, nếu chia nhỏ tập dữ liệu (s) cho mỗi lớp thành các nhóm, được xác định bởi tính thẩm mỹ và mặt.Đối với nhóm này là đáng tin cậy, bạn cần các biến để bắt nguồn từ một data.frame duy nhất, nếu không ggplot có thể kết thúc bằng cách sử dụng một thứ tự khác cho yếu tố facetting và phần còn lại của ánh xạ. – baptiste

Trả lời

23

tl; dr

Never sử dụng [ hoặc $ bên aes().


Hãy xem xét ví dụ minh họa này, nơi biến đánh bóng mặt f là cố ý theo một trật tự không rõ ràng liên quan đến x

d <- data.frame(x=1:10, f=rev(letters[gl(2,5)])) 

Bây giờ đối chiếu những gì xảy ra với hai lô này,

p1 <- ggplot(d) + 
    facet_grid(.~f, labeller = label_both) + 
    geom_text(aes(x, y=0, label=x, colour=f)) + 
    ggtitle("good mapping") 

p2 <- ggplot(d) + 
    facet_grid(.~f, labeller = label_both) + 
    geom_text(aes(d$x, y=0, label=x, colour=f)) + 
    ggtitle("$ corruption") 

enter image description here

Chúng tôi có thể có được một ý tưởng tốt hơn về những gì đang xảy ra bằng cách nhìn vào data.frame tạo nội bộ bởi ggplot2 cho mỗi bảng,

ggplot_build(p1)[["data"]][[1]][,c("x","PANEL")] 

    x PANEL 
1 6  1 
2 7  1 
3 8  1 
4 9  1 
5 10  1 
6 1  2 
7 2  2 
8 3  2 
9 4  2 
10 5  2 

ggplot_build(p2)[["data"]][[1]][,c("x", "PANEL")] 

    x PANEL 
1 1  1 
2 2  1 
3 3  1 
4 4  1 
5 5  1 
6 6  2 
7 7  2 
8 8  2 
9 9  2 
10 10  2 

Cốt truyện thứ hai có các bản đồ sai, bởi vì khi ggplot tạo ra một data.frame cho mỗi bảng điều khiển, nó chọn x giá trị theo thứ tự "sai".

Điều này xảy ra vì việc sử dụng $ ngắt liên kết giữa các biến khác nhau được ánh xạ (ggplot phải giả định nó là biến độc lập, mà tất cả những gì nó biết có thể đến từ nguồn bị ngắt kết nối tùy ý). Vì data.frame trong ví dụ này không được sắp xếp theo hệ số f, tập hợp con data.frames được sử dụng trong nội bộ cho mỗi bảng giả định thứ tự sai.

+0

Cảm ơn rất nhiều sự giúp đỡ của bạn! Ví dụ của bạn thật tuyệt vời! – Christoph

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