【问题标题】:Externalization of code- layout in ggplotggplot 中代码布局的外部化
【发布时间】:2013-02-10 20:20:06
【问题描述】:

我想在 ggplot2 中外部化我的布局,因为我的代码变得非常拥挤。

假设我有一个给定的布局,我将其应用于不同功能的多个绘图。它看起来像这样:

    scale_fill_gradientn(guide="colourbar",colours=costum.colorbar_sand.blue.green)+
      theme (legend.title = element_text(size = 15,family="Arial"))+
      theme (legend.text = element_text(size = 12,family="Arial",angle=45))+
      theme (legend.position = "bottom")+
      coord_map(projection="mercator");

我想把它放在一个外部文件或一个对象中,然后将它调用到我的绘图函数中。

我从knitr package 尝试了 read_chunk,如下所示: 我将上面的空白代码保存在 R 文件中,然后尝试在我的函数中实现它。因此我只是把它写成这样的函数

    function.xy(...){...some ggplot function...
    read_chunk("some\path")
    }

但这并没有成功。 我也试过paste(read_chunk("some\path")) 但这不起作用。

我的另一个想法是将它保存为一个对象,然后粘贴文本,但这不是很好,因为我不知道如何将它保存为纯文本对象(如果有的话像那样)。 任何人都可以建议我如何做到这一点?

【问题讨论】:

  • 如果您将主题更改保存在file.R 中,那么您可以通过source("path_to_file.R") 访问它。你试过吗?
  • 注意:您不必为每个选项重复输入theme()。您可以在原始 theme(..., ..., ...) 调用中使用逗号分隔其他设置。

标签: r optimization ggplot2 knitr


【解决方案1】:

您可以将布局代码外部化为单独的块。请参阅knitr-examples 存储库中的example 083(及其output)。关键是通过<<>> 的块引用。

【讨论】:

  • 你没有想到一切!
  • @BrandonBertelsen 哈哈,我只是在用户提问时收集示例和解决方案,以便有一个学习所有技巧的中心位置。
【解决方案2】:

我做这两种方式之一。在我要编织的文件中,我声明了我知道将经常使用的绘图选项,将分组元素保存在列表中,如下所示:

plot.option1 <- list(scale_fill_gradient(guide="colourbar",colours=costum.colorbar_sand.blue.green),
                     theme(legend.title = element_text(size = 15,family="Arial"),
                           legend.text = element_text(size = 12,family="Arial",angle=45),
                           legend.position = "bottom"),
                     coord_map(projection="mercator"))

那么只需追加+ plot.option1

例如:

ggplot(dat, aes(x,y)) + plot.option1

如果您有很多(比如企业主题),您可以轻松地将它们放在单独的脚本中,然后将其作为源文件放在文件的开头进行编织。

小例子:

plot.opt <- list(scale_color_brewer(palette="Blues"))
ggplot(diamonds, aes(carat, price, color=color)) + geom_point() + plot.opt

【讨论】:

    【解决方案3】:

    另一个与@brandon-bertelsen 非常相似的选项是创建一个自定义函数:

    add.my.layout <- function(g) {
        g + scale_fill_gradientn(guide="colourbar",colours=costum.colorbar_sand.blue.green)+
          theme (legend.title = element_text(size = 15,family="Arial"))+
          theme (legend.text = element_text(size = 12,family="Arial",angle=45))+
          theme (legend.position = "bottom")+
          coord_map(projection="mercator")
    }
    

    然后在你的代码中你可以这样做:

    myggplot <- ggplot(...)
    add.my.layout(myggplot)
    

    如果你愿意,你可以在外部 R 文件中定义你的函数。

    【讨论】:

    • 请注意,没有特定 return() 值的函数可能会出现问题。就个人而言,为了清楚起见,我会保存到一个变量并返回(变量)。
    • 嗯,我读到不包装你的结果作为回报有速度优势,这就是为什么我倾向于这样做......
    猜你喜欢
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2016-10-27
    相关资源
    最近更新 更多