是否可以将绘图命令定义为函数的一部分,然后使用自定义函数绘制?

时间:2011-12-30 14:48:28

标签: r ggplot2

我无法弄清楚为什么以下功能不起作用。如有必要,我将为该示例创建数据。请告诉我。但这需要花费很多时间,因此,我想首先询问没有数据的情况,万一,问题很明显,你可以看到没有数据。

请参阅下面的代码。如果我使用函数

plotReturns(8, "1930-01-01", "1940-12-31", "savehere.pdf")

创建了文件savehere.pdf,但我无法打开它。我收到错误说

  

打开此文档时出错。无法打开此文件,因为它没有页面。

但是,如果不使用该函数,我手动完成该函数代码中的每一步(用上面用作参数的值替换变量名),然后创建文件savehere.pdf,我可以打开它。

所以,看来我的任何特定命令都没有错。但是,为什么函数在被称为函数时不起作用?

感谢您的帮助。

plotReturns = function(decileValue, startDate, endDate, fileName) {
  # Keep data from specific decile
  specificdecile <- merged.data[merged.data$decile_correct == decileValue,]

  #filter the data to get rows within the specified dates
  specificdecileAndYears <- specificdecile[
                            ((specificdecile$rdate >= as.Date(startDate)) &
                              (specificdecile$rdate <= as.Date(endDate))),]
  #keep the necessary columns:rdate, decile_correct, vwret_bottomup, vwret_CRSP
  specificdecileAndYears <- specificdecileAndYears[c("rdate", "decile_correct", 
                                                     "vwret_bottomup", "vwret_CRSP")]
  # Melt the data for plotting
  melted.data <- melt(specificdecileAndYears, id=c("rdate","decile_correct"))

  # Use melted data for plotting

  # Set the plot title
  title <- paste("Plot for decile", decileValue)

  # Specifing colors to be used for line plots
  myColors <- c("steelblue", rgb(1,0.5,0.3,0.5))
  fileName <- fileName

  pdf(fileName, width=8, height=5)

  # scale_color_manual is to use custom colors specified in myColors above.
  # The first argument of scale_color_manual specifies the title of the legend,
  # which is set to empty here.
  ggplot(melted.data, aes(x=rdate, y=value, color=variable)) + geom_line() +
      opts(legend.position=c(0.85,0.2), legend.background=theme_rect(col=0), title=title) +
      scale_color_manual("", values=myColors) +
      ylab("Return") + xlab("")

  # turn device off
  dev.off() 
}

1 个答案:

答案 0 :(得分:5)

这是在FAQ中。

http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-do-lattice_002ftrellis-graphics-not-work_003f

当你在函数内部时,你需要print格子和ggplot对象。它们都是“网格图形”的类型,它们通常在命令的各个部分中构建,而不是总是作为图形设备的副作用。该模型尤其适用于ggplot,其中通常使用“+”绘图运算符添加要素。但是,莱迪思图形函数也会返回列表,因此它们也可以附加到trellis.focusupdate.trellis

等函数中。