2013-09-11 3 views
9

Я рисую тонны графиков, которые по существу используют один и тот же тип форматирования. Просто интересно, можно ли хранить эти слои в переменной и повторно использовать их.Повторное использование слоев ggplot в нескольких графиках

подход 1 (не работает)

t <- layer1() + layer2() 
ggplot(df,aes(x,y)) + t 

подход 2 (работ, но не очень элегантно)

t <- function(x) x + layer1() + layer2() 
t(ggplot(df,aes(x,y)) 

Любое предложение по линии подхода 1?

Спасибо!

+1

Да, но было бы хорошо, если бы вы точно объяснили, что должны быть 'layer1()' и 'layer2()'. Что они возвращают? Что они делают? Обычно я просто сохраняю результат вызова 'geom_ *' в переменной и добавляю его позже. – joran

+1

Просто комментарий: вы, вероятно, не должны перезаписывать относительно общую базовую функцию типа 't()'. – Gregor

+0

@joran Я думал о форматировании слоев, таких как scale_x_continuous() и theme(). Не имеет значения, что они делают? – jamborta

ответ

14

В то время как я жду некоторого разъяснения, вот несколько примеров, свидетельствующих о том, как добавлять ранее созданные слои существующего участка:

p <- ggplot(mtcars,aes(x = cyl,y = mpg)) + 
     geom_point()  
new_layer <- geom_point(data = mtcars,aes(x = cyl,y = hp),colour = "red") 
new_layer1 <- geom_point(data = mtcars,aes(x = cyl,y = wt),colour = "blue") 

p + new_layer 

p + list(new_layer,new_layer1) 
+0

Спасибо, это работает с примерами, которые я имел в виду. – jamborta

1

Я знаю, что это старый, но вот один, что позволяет избежать неуклюжих т (ggplot (...)))

t<-function(...) ggplot(...) + layer1() + layer2() 
t(df, aes(x, y)) 
5

Основываясь на Joran's answer, теперь я кладу слои в список, и добавить его в моих участках. Работает как шарм:

r = data.frame(
    time=c(5,10,15,20), 
    mean=c(10,20,30,40), 
    sem=c(2,3,1,4), 
    param1=c("A", "A", "B", "B"), 
    param2=c("X", "Y", "X", "Y") 
) 
gglayers = list(
    geom_point(size=3), 
    geom_errorbar(aes(ymin=mean-sem, ymax=mean+sem), width=.3), 
    scale_x_continuous(breaks = c(0, 30, 60, 90, 120, 180, 240)), 
    labs(
    x = "Time(minutes)", 
    y = "Concentration" 
) 
) 
ggplot(data=r, aes(x=time, y=mean, colour=param1, shape=param1)) + 
    gglayers + 
    labs(
    color = "My param1\n", 
    shape = "My param1\n" 
) 
ggplot(data=r, aes(x=time, y=mean, colour=param2, shape=param2)) + 
    gglayers + 
    labs(
    color = "My param2\n", 
    shape = "My param2\n" 
) 
+2

Этот ответ выигрывает для меня, потому что мне не нужно указывать источник данных (это означает, что я могу перерабатывать слои для кучи одинаково структурированных кадров данных) – rensa

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