2012-04-04 26 views
18

Trong sách của Hadley Wickham ggplot2 trong chương 10.3, anh ta ám chỉ để tạo ra các chức năng cốt truyện. Tôi muốn tạo ra nhiều ô tương tự sử dụng faceting, nhưng tôi không thể tham chiếu đến một cột. Nếu tất cả các tài liệu tham khảo của tôi là trong thẩm mỹ sau đó tôi có thể sử dụng aes_string và tất cả mọi thứ hoạt động. Facet_wrap dường như không có sự tương tự.Thực hiện các chức năng cốt truyện với ggplot và aes_string

library(ggplot2) 
data(iris) 

Đây là cốt truyện tôi muốn thực hiện chức năng.

pl.flower1 <- ggplot(data=iris, 
        aes_string(x='Sepal.Length', y='Sepal.Width', color='Petal.Length')) + 
           geom_point() +facet_wrap(~Species) 

này hoạt động nếu tôi không khía cạnh.

flowerPlot <- function(dat, sl, sw, pl, sp){ 
    ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + geom_point() 
} 
pl.flower2 <- flowerPlot(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length') 

Điều gì sẽ "sp" là hai dòng bên dưới? Một công thức, một chuỗi? Có lẽ toàn bộ aproach là sai.

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + geom_point() +facet_wrap(sp) 
    } 
    pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length', sp= ?????) 

Ngoài câu trả lời, tôi rất thích con trỏ về cách mọi người tiếp cận vấn đề này?

+0

Đối với cách tiếp cận giải quyết câu hỏi này, tôi có thể kiểm tra [StackOverflow] (http://stackoverflow.com/questions/8043247/writing-r-functions-with-optional-arguments) trước tiên. :) – joran

+0

Cũng được hỏi tại đây: http://stackoverflow.com/questions/11028353/passing-string-variable-facet-wrap-in-ggplot-using-r –

Trả lời

15

facet_wrap hy vọng một công thức như là đối số đầu tiên của mình, vì vậy tôi chỉ muốn ép buộc nó với as.formula, và thức ăn trong sp của tôi như là một chuỗi:

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + 
     geom_point() +facet_wrap(as.formula(sp)) # note the as.formula 
} 
pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', 
          sw='Sepal.Width', pl='Petal.Length', 
          sp= '~Species') 

Ngoài nếu công thức của tôi luôn trông giống như ~[columnname], tôi chỉ có thể tạo công thức đó thành flowerPlotWrap và chuyển vào tên cột :

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + 
     geom_point() +facet_wrap(as.formula(sprintf('~%s',sp))) 
} 
pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', 
          sw='Sepal.Width', pl='Petal.Length', 
          sp= 'Species') 

(kudo đến ví dụ tái sản xuất trong câu hỏi của bạn! Nếu mọi người hỏi câu hỏi cũng như rằng họ sẽ nhận được câu trả lời nhanh hơn nhiều).

+0

Cảm ơn câu trả lời rõ ràng. Làm thế nào bạn tìm ra rằng facet_wrap mong đợi một công thức? –

+0

Nếu bạn nhìn vào '? Facet_wrap' nó nói' facet_wrap (các khía cạnh, ...) 'và' các khía cạnh: công thức chỉ định các variabls cho khía cạnh bởi'. –

1

Chức năng của bạn hoạt động tốt đối với tôi chưa được sửa đổi nếu tôi chỉ sử dụng sp='Species', tức là tên của biến mà bạn muốn khía cạnh.

flowerPlotWrap(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length', sp='Species')

enter image description here

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