2012-05-31 5 views
2

Я использую R и ggplot2 для анализа статистики баскетбола. Я новичок в R и ggplot, и мне нравятся результаты, которые я получаю, учитывая мой ограниченный опыт. Но когда я иду, я обнаружил, что мой код повторяется; что мне не нравится.Рефакторинг повторяющегося кода ggplot

Я создал несколько участков, подобных этому:

Net Rating by Effective Field Goal percentage

Код:

efgPlot <- ggplot(gmStats, aes(EFGpct, Nrtg)) + 
    stat_smooth(method = "lm") + 
    geom_point(aes(colour=plg_ShortName, shape=plg_ShortName)) + 
    scale_shape_manual(values=as.numeric(gmStats$plg_ShortName)) 

Только разница между грядами является й-значением; Следующий сюжет будет:

orPlot <- ggplot(gmStats, aes(ORpct, Nrtg)) + 
    stat_smooth(method = "lm") + ... # from here all is the same 

Как я мог реорганизовать это, так что я мог бы сделать что-то вроде:

efgPlot <- getPlot(gmStats, EFGpct, Nrtg)) 
orPlot <- getPlot(gmStats, ORpct, Nrtg)) 

Update

Я думаю, что мой путь рефакторинга это не действительно «R-ish» (или ggplot-ish, если хотите); основанный на комментарии Baptiste ниже, я решил это, не перерабатывая что-либо в функцию; см. my answer below.

+1

Я бы предположим, что вы 'расплава()' ваш набор данных в длинном формате, с 'm = melt (gmStats, id =" Nrtg ")'. Затем вы можете построить график с помощью 'ggplot (m, aes (Nrtg, value)) + facet_wrap (~ variable) + ...' или использовать 'dlply (m," variable ", plottingFunction)' для создания нескольких графиков. – baptiste

+0

Попробуем это тоже. Пока я принял ответ Джорана, но это хорошее предложение для меня изучить. – Marijn

+0

@baptiste - ваш расплав + facet_wrap - отличное решение, я опубликовал код, который я в конечном итоге использовал в [ниже] (http://stackoverflow.com/a/10862755/322283). – Marijn

ответ

6

Ключ к такому роду вещь использует aes_string вместо aes (непроверенной, конечно):

getPlot <- function(data,xvar,yvar){ 
    p <- ggplot(data, aes_string(x = xvar, y = yvar)) + 
      stat_smooth(method = "lm") + 
      geom_point(aes(colour=plg_ShortName, shape=plg_ShortName)) + 
      scale_shape_manual(values=as.numeric(data$plg_ShortName)) 
    print(p) 
    invisible(p) 
} 

aes_string позволяет передавать имена переменных в виде строк, а не выражение, что более удобно, когда записывая функции. Конечно, вы можете не захотеть жесткого кода цвета и формы шкалы, и в этом случае вы можете использовать aes_string снова для них.

+0

Мне пришлось выполнить 'aes_string (x = xvar, y = yvar)' вместо 'aes_string (xvar, yvar)'; но я думаю, что я понял это сейчас. Я исправил ваш ответ. Спасибо, это было очень полезно. – Marijn

1

Хотя ответ Joran в helpt мне много (и он точно отвечает на мой вопрос), я в конце концов решил это в соответствии с предложением Батист по:

# get the variablesI need from the stats data frame: 
forPlot <- gmStats[c("wed_ID","Nrtg","EFGpct","ORpct","TOpct","FTTpct", 
        "plg_ShortName","Home")] 
# melt to long format: 
forPlot.m <- melt(forPlot, id=c("wed_ID", "plg_ShortName", "Home","Nrtg")) 
# use fact wrap to create 4 plots: 
p <- ggplot(forPlot.m, aes(value, Nrtg)) + 
    geom_point(aes(shape=plg_ShortName, colour=plg_ShortName)) + 
    scale_shape_manual(values=as.numeric(forPlot.m$plg_ShortName)) + 
    stat_smooth(method="lm") + 
    facet_wrap(~variable,scales="free") 

Который дает мне:

Net rating as function of four performance indicators

Смежные вопросы