2011-06-29 74 views
5

Để thuận tiện cho tôi, tôi muốn viết một hàm để thêm một ô và một ô phân tán vào một ô đã tồn tại. Tôi đã xác định:Thêm dòng với các điểm vào một ô trong ggplot2

addlinetoplot <- function(dataset, varx, vary) 
    { 
     p <- geom_line(data=dataset, aes_string(x=varx, y=vary)) + 
      geom_point(data=dataset, aes_string(x=varx, y=vary)) 

     p 
    } 

Chức năng trên không hoạt động. Nó hoạt động nếu tôi xóa các dấu hiệu + và phần geom_point(). Ở trên không có tác dụng bởi vì vì một lý do nào đó, người ta không thể thêm hai cái đó. Ví dụ sau minh họa vấn đề.

Sau đó, tôi đã cố gắng:

df1 <- data.frame(c1 = c(1:10), c2 = c(1:10)) 
c1 <- c(1:10) 
csq <- c1^2 
df2 <- data.frame(c1 = c(1:10), csq) 
pltbase <- ggplot() + geom_line(df1, aes(x="c1", y="c2")) 

# This does not work. 
pltbase + addlinetoplot(dataset=df2, varx = "c1", vary = "csq") 

Tôi nhận thấy vấn đề là với tuyên bố:

addthistotheplot <- geom_line(data=df2, aes_string(x="c1", y="csq")) + 
        geom_point(data=df2, aes_string(x="c1", y="csq")) 

Đang cố gắng để xác định các tuyên bố trên ném một lỗi: đối số không phải số để điều hành nhị phân.

Làm thế nào tôi có thể xác định addlinetoplot() chức năng để tôi có thể thực hiện:

pltbase + addlinetoplot(dataset=df2, varx = "c1", vary = "csq") 

làm việc. Một cách là tách biệt geom_line và geom_point và có định nghĩa chức năng khác nhau cho mỗi. Có cách nào để làm điều đó trong cùng một chức năng?

Cảm ơn!

Trả lời

11

Tôi không thể tìm thấy tài liệu tham khảo ngay bây giờ, nhưng có câu trả lời trên SO ở đâu đó giải thích bạn có thể thêm vào ô ggplot bằng cách chuyển đối số mới dưới dạng danh sách. Theo đó, chức năng của bạn trở thành:

addlinetoplot <- function(dataset, varx, vary) { 
    list(
    geom_line(data=dataset, aes_string(x=varx, y=vary)), 
    geom_point(data=dataset, aes_string(x=varx, y=vary)) 
) 
} 

Và sau đó mã âm mưu của bạn trông giống như:

pltbase <- ggplot() + geom_line(data = df1, aes(x=c1, y=c2)) 
pltbase + addlinetoplot(df2, varx = "c1", vary = "csq") 

Kết quả trong:

enter image description here

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