У меня есть команда ggplot
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
внутри функции. Но я хотел бы иметь возможность использовать параметр функции, чтобы выбрать столбец для использования в качестве цвета и группы. Т.е. хотелось бы что-то подобное
f <- function( column ) {
...
ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}
Так что столбец, используемый в ggplot, определяется параметром. Например, для f ("majr") мы получаем эффект
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
но для f («пол») мы получаем эффект
ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )
Некоторые вещи, которые я пробовал:
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )
не сработало. И не
e <- environment()
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )
aes_string(x = rates.by.groups$name...
, и в любом случае вам не нужно, поскольку вы уже передалиggplot(data = rates.by.groups...
аргумент. (Проблема в этом вопросе )"column_name"
или"column"
не сработаетИз выпуска нот в
ggplot2 V3.0.0
:Идиоматическим способом было бы преобразовать в символ строку, содержащуюся в переменной, используя
sym()
(что почти то же, что и базовые псевдонимыas.name()
/as.symbol()
), и отменить кавычки, используя!!
Моделируя данные OP, мы можем:
Если бы мы предпочли использовать необработанные имена для функции, мы можем:
Он будет работать с именами, также известными как символы, И со строковыми литералами
Как говорит Лайонел
ensym()
:Примечание о
enquo()
enquo()
заключает в кавычки выражение (не обязательно символ), передаваемое аргументу, оно не преобразует строковый литерал в символ, как этоensym()
делает, поэтому он может быть менее адаптирован здесь, но мы можем сделать:источник
aes()
сама по себе говорит об этом,enquo()
но это не работает. А кто слышалensym()
раньше? BIG SIGHf2
все четыре примера работают, как и захват имени столбца в переменной (т.е.aname <- "mjr"; f2(aname)
). Если я добавлю код для управления фреймом данных сdplyr
его помощью, он попытается найти столбец, используя имя переменной, а не строку в имени переменной. Другими словами, как мне приступитьrates.by.groups %>% group_by(!!column)...
к работе и по-прежнему поддерживать три способа звонкаf2
?ensym
предназначен для работы с аргументами, предоставленными как имена, и допускает кавычки вокруг них. Я считаю, что вы хотели бы рассматривать аргумент как имя и использовать значение, если имя не найдено. На самом деле это то, что происходит сselect
, но не сgroup_by
... Можно обойти это, но не очевидно. Если для вас это важно, я думаю, это заслуживает отдельного вопроса.select
иgroup_by
так , что, скорее всего , вопрос. Я могу создать новый вопрос, но мне нужно придумать простой пример и проверить, есть ли на него ответ. Если нет, могу выложить.facet_grid
? Он работает,facet_grid(cols = vars(!!column))
но выдает ошибку сfacet_grid(~ !!column)
Попробуйте использовать
aes_string
вместоaes
.источник
Другой вариант (
ggplot2 > 3.0.0
) - использовать аккуратное оценочное местоимение,.data
чтобы вырезать выбранную переменную / столбец изrates.by.groups
фрейма данных.Создано 04.04.2019 пакетом REPEX (v0.2.1.9000)
источник
Использование
aes_string
действительно решает эту проблему, но сталкивается с проблемой при добавлении полос погрешностейgeom_errorbar
. Ниже представлено простое решение.Бонус, вы также можете добавить грани к своему графику, используя эти строки внутри ggplot:
Этот сценарий был изменен из исходного сообщения: ggplot2 - панели ошибок с использованием пользовательской функции
источник
Вот очень простой пример.
Просто сделай две вещи
!!
когда используетеисточник