Я, как правило, получаю невероятно сложные цифры ggplot
с большой настройкой, поэтому я, естественно, добавляю их в свой код как функции, чтобы я мог их легко использовать повторно. Проблема возникает, когда я хочу использовать одну из моих пользовательских функций, но слегка ее настраиваю, например. удаление или добавление эстетики к геометрии, которую я уже определил внутри функции. Мои варианты для этого являются:Реализация опций геометрии от пользовательской функции
Создать почти дубликат функции, но с добавлением конкретного изменения, и имя функции изменено, чтобы отразить это или
Добавить аргументы функции, которые изменяют, как
ggplot
является построенный внутри функции
я стараюсь и выбрать 2. столько, сколько я могу, потому что это явно уменьшает количество избыточности и беспорядок в моих сценариях.
Однако есть моменты, когда 2. почти вырождается в 1. внутри функции, заставляя меня перепечатывать целые геомные функции, содержащие несколько аргументов. Я приведу очень простой пример, обнажая в виду, что функции я далеко усложняющих и стоит задуматься над тем, что я делаю здесь:
gg_custom_point <- function(df, xvar, yvar, gvar=NA){
g <- ggplot(df)
if(is.na(gvar)){
# do geom without colour
g <- g + geom_point(aes_string(x=xvar, y=yvar))
}
else{
# do geom with colour - mostly redundant code
g <- g + geom_point(aes_string(x=xvar, y=yvar, colour=gvar))
}
return(g)
}
# I can use the same function to make slightly different custom plots
gg_custom_point(mtcars, "wt", "mpg")
gg_custom_point(mtcars, "wt", "mpg", "qsec")
Вопрос заключается в том, что мне пришлось перепечатывать весь geom_point
вместо будучи в состоянии просто добавить эстетику. Проблема избыточности еще хуже, если я когда-либо захочу настроить множественную эстетику для одной геометрии - мне нужно ввести геометрию, содержащую все комбинации эстетики, которые могут быть использованы в данных аргументах.
Я мог бы сделать это:
g <- g + geom_point(aes_string(x=xvar, y=yvar))
if(!is.na(gvar)){
# Add to the global aesthetic - no need to retype the whole geom
g <- g + aes_string(colour=gvar)
}
Но это не масштабируется на несколько геометрий с использованием нескольких источников данных, так как вся геометрии нужна будет использовать этот цвет эстетик и gvar
колонки.
Есть ли способ легко добавить эстетику к конкретным геомам, которые уже были добавлены в объект ggplot
? В качестве альтернативы, существует ли лучший способ использования функций и геометрий в пользовательской функции ggplot2
?