【问题标题】:R: Get quantmod's chartSeries and AddTA to not show last valueR:获取 quantmod 的 chartSeries 和 AddTA 以不显示最后一个值
【发布时间】:2023-03-28 00:36:01
【问题描述】:

使用 chartSeries 时,默认情况下它还会在图的左上角显示最后一个值。有什么办法阻止它这样做吗?

当使用 addTA 添加新的 TA 时,您可以通过设置参数 legend = "" 来避免绘图上的最后一个值,但前提是您要为 TA 制作新的绘图。如果 TA 位于先前绘制的图形上,则无论您在 legend 参数中输入什么,它都会显示最后一个值。

getSymbols ("AAPL", src = "google")
chartSeries(AAPL)

我可以在这里使用什么来防止它打印图上的最后一个值?

addTA(EMA(Cl(AAPL)), on = 1, legend = "")

这仍然会在图的左上角打印最后一个值。奇怪的是,如果你在这样的新情节上绘图,它就不会这样做:

addTA(EMA(Cl(AAPL)), legend = "")

默认情况下是这样,还是我可以做些什么来解决它?

【问题讨论】:

    标签: r charts quantmod


    【解决方案1】:

    默认显示最后一个值(是的,很烦人)。您可能需要修改源代码以删除 addTA 中显示的最后一个数字。

    我不使用addTA,而是使用add_TAchart_Series,因为我认为它们看起来好多了(quantmod 的第二代图表)。这是一个解决方案,它从 add_TA 版本的显示中删除了最后一个数字。但你必须愿意修改源代码。

    在 add_TA 中,您需要修改源代码的大约 56-60 行:

    替换text.exp,就是这样:

    # this is inside add_TA:
    if (is.na(on)) {
        plot_object$add_frame(ylim = c(0, 1), asp = 0.15)
        plot_object$next_frame()
        text.exp <- expression(text(x = c(1, 1 + strwidth(name)), 
                                    y = 0.3, labels = c(name, round(last(xdata[xsubset]), 
                                                                    5)), col = c(1, col), adj = c(0, 0), cex = 0.9, 
                                    offset = 0, pos = 4))
        plot_object$add(text.exp, env = c(lenv, plot_object$Env), 
    

    进行这些修改:

    if (is.na(on)) {
        plot_object$add_frame(ylim = c(0, 1), asp = 0.15)
        plot_object$next_frame()
        text.exp <- expression(text(x = c(strwidth(name)), # <- affects label on the subchart
                                y = 0.3, labels = name, col = c(col), adj = c(0), cex = 0.9, 
                                offset = 1, pos = 4))
         plot_object$add(text.exp, env = c(lenv, plot_object$Env), 
                    expr = TRUE)
    

    ... 并将修改后的代码分配给一个新变量,称为add_TA.mine

    add_TA.mine <- function (x, order = NULL, on = NA, legend = "auto", yaxis = list(NULL, 
                                                                      NULL), col = 1, taType = NULL, ...) 
    {
      lenv <- new.env()
      lenv$name <- deparse(substitute(x))
      lenv$plot_ta <- function(x, ta, on, taType, col = col, ...) {
        xdata <- x$Env$xdata 
        ....
         [all the code for the rest of the function with modifications]....
    
               }
        }
        plot_object
    }
    

    现在,用修改后的函数运行代码

    library(quantmod)
    getSymbols("AAPL")
    
    environment(add_TA.mine) <- environment(get("add_TA", envir = asNamespace("quantmod")))
    assignInNamespace(x = "add_TA", value = add_TA.mine, ns = "quantmod")
    
    
    chart_Series(AAPL, subset = "2017")
    add_TA(RSI(Cl(AAPL)))
    quantmod:::add_TA(RSI(Cl(AAPL)))
    

    你可以看到最后一个值不再打印了:

    (您可以在旧的addTA 代码中进行相同类型的更改(如果您真的想坚持旧的情节,可以通过chartSeries

    如果您对更改感到满意,并希望在 add_TA 中永久保留它们,您可以自己重新编译 quantmod 源代码并进行修改(即您需要下载 quantmod 源代码并重新编译包) .如果你把事情弄得一团糟,你总是可以重新下载原始的quandmod源代码。

    【讨论】:

    • 谢谢,但最终源代码不需要修改。它现在的工作方式,虽然第二代图表 add_TA 在您之前绘制的数据下方创建新图表时会打印最后一个值,但至少当您在现有图表之一上添加 TA 时它不会这样做通过使用 on = 参数。由于我倾向于添加很多符号和引用(通常在 xts 图中),因此我需要一种方法让 chartSeries 不会用我添加到图表中的每个符号或指标的最后值填充屏幕。只要知道这个第二代图表就会有很大帮助。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多