2013-12-10 5 views
4

Я, как правило, получаю невероятно сложные цифры ggplot с большой настройкой, поэтому я, естественно, добавляю их в свой код как функции, чтобы я мог их легко использовать повторно. Проблема возникает, когда я хочу использовать одну из моих пользовательских функций, но слегка ее настраиваю, например. удаление или добавление эстетики к геометрии, которую я уже определил внутри функции. Мои варианты для этого являются:Реализация опций геометрии от пользовательской функции

  1. Создать почти дубликат функции, но с добавлением конкретного изменения, и имя функции изменено, чтобы отразить это или

  2. Добавить аргументы функции, которые изменяют, как 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?

ответ

1

Не знаю, достаточно ли этого, что вам нужно - это упрощает ваш пример выше, устанавливая аргументы NULL вместо NA. Он не охватывает все параметры, но устраняет необходимость в операторах if, поскольку аргумент, установленный на NULL, не выдает ошибку, например NA. Также должен быть масштабируемым для нескольких геометров с дополнительными аргументами функции.

gg_custom_point <- function(dat, xvar, yvar, gvar=NULL ,grp=NULL , ... , 
               mytheme=NULL) 
{ 
    g <- ggplot() + 
    geom_point(data=dat, aes_string(x=xvar, y=yvar, colour=gvar, group=grp), ...) + 
    mytheme 

    return(g) 
    } 


gg_custom_point(mtcars, "wt", "mpg") 
gg_custom_point(mtcars, "wt", "mpg", "qsec") 
gg_custom_point(mtcars, "wt", "mpg", "qsec" , size=10) 
gg_custom_point(mtcars, "wt", "mpg", "qsec" , size=10 , mytheme=theme_bw()) 
Смежные вопросы