有条件地ggplot线或点绘图

时间:2015-07-09 15:21:37

标签: r ggplot2

我正在使用ggplot在函数内写一堆图。我想将另一个标志传递给函数,以便我可以在调用函数时选择是否绘制线条或点。

目前我这样做:

plot2pdfHD = function(opdata, dir = 'plots'){
  #... do something ...
  plots <- list()

  for (i in seq(strikes)){
    #... do something ...
    plots[[i]] <- ggplot(sset, aes(x = TIMESTAMP, y = value, col = optype)) + 
      geom_line() + labs(x = "Time", y = 'values') + 
      #... do something ...
  }

  pdf(paste0(dir, '/', Sys.Date(), '.pdf'), width=16, height=10)
  for(i in seq(length(plots)))
    tryCatch({print(plots[[i]])}, error = function(e) NULL)
  dev.off()
}

我想添加一个标志,以便通过为标志设置适当的值,我可以在调用函数时在geom_line()geom_point()之间切换。

另外:

是否可以在不重复其他通话部分的情况下完成,即#... do something ...?我希望得到一个答案。

sset也是opdata的一部分。

2 个答案:

答案 0 :(得分:5)

也许这就是你要找的东西?我喜欢@ arvi1000的答案---很好但很清楚 - 但你可以把if语句放在一个ggplot添加表达式中:

type = "line"
## also try with
# type = "point"

ggplot(mtcars, aes(x = wt, y = mpg)) + {
      if(type == "point") geom_point() else geom_line()
    } +
    theme_bw()

对于多层,我会建议这样的事情:

gg = ggplot(mtcars, aes(x = wt, y = mpg))

{if(type == "point") {
    gg + geom_point() 
  } else {
    gg + geom_line() + stat_smooth()
}} + theme_bw()

(当然,将theme_bw()添加到原始gg定义会更干净,但这表明可以稍后添加。)

答案 1 :(得分:1)

普通的旧if阻止?

plot2pdfHD = function(opdata, dir = 'plots', plot_type){

  plots <- list()

  for (i in seq(strikes)) {

    # base gg call
    p <- ggplot(sset, aes(x = TIMESTAMP, y = value, col = optype))

    # add geom layer based on content of argument:
    if(plot_type == 'line')  p <- p + geom_line()      
    if(plot_type == 'point') p <- p + geom_point()

    # add additional params and assign into list item        
    plots[[i]] <- p + labs(x = "Time", y = 'values')

    #...
  }

  # ...
}

其他说明:

  • 我假设你在每次通话之前做了一些让sset不同的事情,否则你将得到一份相同的情节列表
  • lapply可能比这里的for循环更好,特别是因为你想要一个列表对象作为结果