Подтвердить что ты не робот

Создание сюжетных функций с помощью ggplot и aes_string

В книге Хэдли Уикхема ggplot2 в главе 10.3 он ссылается на создание сюжетных функций. Я хочу сделать много похожих графиков, которые используют огранку, но я не могу ссылаться на столбец. Если все мои ссылки находятся в эстетике, тогда я могу использовать aes_string, и все работает. Facet_wrap, похоже, не имеет аналога.

library(ggplot2)
data(iris)

Это сюжет, который я хочу функционировать.

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

Это работает, если я не граничу.

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')

Что должно быть "sp" для двух строк ниже? Формула, строка? Возможно, весь аплоад ошибочен.

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= ?????)

В дополнение к ответу я бы полюбил указатель на то, как кто-то подходит к этой проблеме?

4b9b3361

Ответ 1

facet_wrap ожидает формулу в качестве ее первого аргумента, поэтому я просто принуждаю ее к as.formula и коршу в моей sp как строку:

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')

В качестве альтернативы, если моя формула всегда будет выглядеть как ~[columnname], я мог бы просто построить ее в flowerPlotWrap и передать имя столбца:

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')

(Престижность к воспроизводимому примеру в вашем вопросе! Если бы все задавали вопросы, а также чтобы они получали ответы намного быстрее).

Ответ 2

Ваша функция отлично работала для меня без изменений, если я только что использовал sp='Species', то есть имя переменной, которую вы хотите сделать факетом.

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

enter image description here