Создание сюжетных функций с помощью 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= ?????)
В дополнение к ответу я бы полюбил указатель на то, как кто-то подходит к этой проблеме?
Ответы
Ответ 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]()