使用 plot.xts 开发版的自定义绘图函数

Custom plot function using development version of plot.xts

我正在构建一个自定义函数,自动将图例添加到 plot.xts 对象。

代码在这里:

library(xts)
library(PerformanceAnalytics)
data(edhec)
R <- edhec[,1:4]
chartS <- function(R, 
                   y = NULL, 
                   multi.panel = FALSE, 
                   type = "l", 
                   yaxis.same = TRUE, 
                   event.lines = NULL, 
                   event.labels = NULL, 
                   event.col = 1,
                   event.offset = 1.2, 
                   event.pos = 2, 
                   event.srt = 90, 
                   event.cex = 1.5,
                   lty = 1,
                   lwd = 2,
                   legend.loc = NULL, 
                   legend.names = NULL, ...) {

  plot.xts(R, y = y, multi.panel = multi.panel, 
           type = type, yaxis.same = yaxis.same, lty = lty, lwd = lwd, ...)

  plot_object <- xts:::current.xts_chob()

  columns <- plot_object$Env$xdata
  columnnames <- plot_object$Env$column_names

  if(!is.null(event.lines)) {
    # error occurred
    addEventLines(xts(event.labels, as.Date(event.lines)), 
                  offset = event.offset, pos = event.pos, 
                  srt = event.srt, cex = event.cex, col = event.col, ...)
  }

  if(is.null(legend.loc))
    legend.loc <- "topright"  
  if(is.null(legend.names))
    legend.names <- columnnames

  if(!multi.panel)
    addLegend(legend.loc, legend.names, lty = lty, lwd = lwd, ...)
}


# chartS(R)
# chartS(R, lty = 1:4)
chartS(R, multi.panel = TRUE)

当我设置 multi.panel = TRUE 时,我未能绘制多个 windows 且没有消息。但是,如果我删除 plot.xts 以下的代码或将它们移动到 plot.xts 以上的代码,它会再次起作用。

删除下面的代码 plot.xts

library(xts)
library(PerformanceAnalytics)
data(edhec)
R <- edhec[,1:4]
chartS <- function(R, 
                   y = NULL, 
                   multi.panel = FALSE, 
                   type = "l", 
                   yaxis.same = TRUE, 
                   event.lines = NULL, 
                   event.labels = NULL, 
                   event.col = 1,
                   event.offset = 1.2, 
                   event.pos = 2, 
                   event.srt = 90, 
                   event.cex = 1.5,
                   lty = 1,
                   lwd = 2,
                   legend.loc = NULL, 
                   legend.names = NULL, ...) {

  plot.xts(R, y = y, multi.panel = multi.panel, 
           type = type, yaxis.same = yaxis.same, lty = lty, lwd = lwd, ...)


}


# chartS(R)
# chartS(R, lty = 1:4)
chartS(R, multi.panel = TRUE)

将代码移至 plot.xts

以上
library(xts)
library(PerformanceAnalytics)
data(edhec)
R <- edhec[,1:4]
chartS <- function(R, 
                   y = NULL, 
                   multi.panel = FALSE, 
                   type = "l", 
                   yaxis.same = TRUE, 
                   event.lines = NULL, 
                   event.labels = NULL, 
                   event.col = 1,
                   event.offset = 1.2, 
                   event.pos = 2, 
                   event.srt = 90, 
                   event.cex = 1.5,
                   lty = 1,
                   lwd = 2,
                   legend.loc = NULL, 
                   legend.names = NULL, ...) {


  columns <- ncol(R)
  columnnames <- colnames(R)

  if(!is.null(event.lines)) {
    # error occurred
    addEventLines(xts(event.labels, as.Date(event.lines)), 
                  offset = event.offset, pos = event.pos, 
                  srt = event.srt, cex = event.cex, col = event.col, ...)
  }

  if(is.null(legend.loc))
    legend.loc <- "topright"  
  if(is.null(legend.names))
    legend.names <- columnnames

  if(!multi.panel)
    addLegend(legend.loc, legend.names, lty = lty, lwd = lwd, ...)

  plot.xts(R, y = y, multi.panel = multi.panel, 
           type = type, yaxis.same = yaxis.same, lty = lty, lwd = lwd, ...)
}


# chartS(R)
# chartS(R, lty = 1:4)
chartS(R, multi.panel = TRUE)

有什么建议吗?

您需要跟踪正在构建的绘图对象,return 它会自动打印。您也不应该访问未导出的对象 (xts:::current.xts_chob()),因为不能保证它们在各个版本中保持一致。

chartS <-
function(R, y = NULL, multi.panel = FALSE, type = "l", yaxis.same = TRUE, 
         event.lines = NULL, event.labels = NULL, event.col = 1,
         event.offset = 1.2, event.pos = 2, event.srt = 90, event.cex = 1.5,
         lty = 1, lwd = 2, legend.loc = NULL, legend.names = NULL, ...)
{
  plot_object <- plot.xts(R, y = y, multi.panel = multi.panel, type = type,
    yaxis.same = yaxis.same, lty = lty, lwd = lwd, ...)

  columns <- plot_object$Env$xdata
  columnnames <- plot_object$Env$column_names

  if(!is.null(event.lines)) {
    plot_object <-
      addEventLines(xts(event.labels, as.Date(event.lines)), offset = event.offset,
        pos = event.pos, srt = event.srt, cex = event.cex, col = event.col, ...)
  }

  if(is.null(legend.loc))
    legend.loc <- "topright"  
  if(is.null(legend.names))
    legend.names <- columnnames

  if(!multi.panel)
    plot_object <- addLegend(legend.loc, legend.names, lty = lty, lwd = lwd, ...)

  return(plot_object)
}