在多个图表中重复使用ggplot层

16

我正在制作大量图表,它们基本上使用相同的格式。只是想知道是否可以将这些层存储在一个变量中并重用。

方法1(不起作用)


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

方案二(可行但不够优雅)

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

有沿着方法1的建议吗?
谢谢!

1
是的,但如果您能解释一下 layer1()layer2() 应该是什么,那就更好了。它们返回什么?它们做什么?通常情况下,我会将 geom_* 调用的结果保存在变量中,并稍后添加。 - joran
1
只是一条评论:您可能不应该覆盖一个相对常见的基础函数,比如t() - Gregor Thomas
@joran 我在考虑像scale_x_continuous()和theme()这样的格式化层。这样做有什么区别吗? - jamborta
正如你所发现的那样,它应该是一样的。为了避免混淆,你应该知道像scale_*theme()这样的东西通常不被称为 ggplot 中的“图层”。那个词通常指 geom 和 stat。 - joran
3个回答

23

在等待澄清的同时,这里有几个示例展示如何将先前创建的图层添加到现有的绘图中:

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)

20
根据Joran的回答,我现在把我的图层放到一个列表里,并添加到我的绘图中。效果很好:
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"
  )

3
这个答案对我来说是最好的,因为我不需要指定数据源(这意味着我可以将图层重复使用在一堆类似结构的数据框中)。 - jimjamslam

4

虽然这篇文章有点旧,但是下面这个方法可以避免使用笨拙的t(ggplot(...))):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接