【问题标题】:How to plot simple vertical line with abline() in R?如何在 R 中用 abline() 绘制简单的垂直线?
【发布时间】:2019-11-14 10:38:02
【问题描述】:

我无法在图表中添加垂直线或水平线。我觉得我错过了一些非常简单的东西,但我似乎找不到它。我从互联网上复制了一些例子,但它不起作用。我做错了什么?

这就是我正在尝试的:

library(quantmod)
getSymbols("^FTSE", src="yahoo", from=as.Date('2004-01-01'), 
           to=as.Date('2013-01-01'), periodicity="weekly")

plot(FTSE$FTSE.Close)
abline(v='2008-01-01', col="red")

我也试过了:

abline(h = 5000, col="red")abline(h = mean(FTSE$FTSE.Close), col="red")

但它们也不起作用。没有显示任何线条。

我只想要一条垂直线。我正在使用 RStudio。

【问题讨论】:

  • 试试abline(v=1, col="red"),x轴上的线在哪里?
  • 怎么不工作?
  • 这就是我用abline(v=1, col="red") 得到的:imgur.com/d1poYSI
  • 请始终说明所有library 电话,这一次我帮助了你。
  • 重复,有趣但没有回答:stackoverflow.com/q/18923382/6574038

标签: r plot time-series


【解决方案1】:

您想使用v 参数(用于垂直)而不是h 参数(用于水平)。这是一个可重现的示例:

d <- data.frame("y" = 1:5, 
                "dates" = paste0("2012-01-0", 1:5))

plot(d$y ~ d$dates)

abline(v = which(d$dates == "2012-01-01"), col = "red")

【讨论】:

  • 这确实有效,但我无法用我的示例重现这一点。
【解决方案2】:

这可能应该在 CRAN 发布。 (这已经在github 发布,解决方案发布在other answer。)

这里有一个解决方法。

根据this 的回答,我们可以用lines 而不是abline 绘制一个垂直常数。 plot.xts,当我们绘制 "xtx" 对象时使用,似乎有些错误或混乱,因为它也是链接答案中的注释信号,建议改用 zoo::plot.zoo

another 的回答中我们了解到,我们可以使用.index() 来提取数据下方的索引,类似于值位于标签下方的因素。

但是,plot.zoo 根据未知的平滑算法(可能可以通过深入研究zoo::plot.zoo 找出)修剪日期,而我们正在绘制的日期可能恰好撞上了这样一个“黑洞”。一种可能的解决方案是给plot.zoo 一个sapply x 坐标的宽边。我写了一个函数genXcords

genXcords <- function(data, date, tadj=0, ladj=0) {
  idx <- as.Date(as.POSIXct(.index(data), origin="1970-01-01"))
  se <- seq(as.Date(date) - 5 - tadj, by="day", length.out=21 + ladj)
  y.crds <- .index(data)[which(min(se) < idx & idx < max(se))]
  return(y.crds)
}

首先从数字索引中提取日期。接下来,它创建一个日期序列,其中包含要在其中某处绘制的日期。注意调整参数tadjladj,因为之后需要进行一些微调。 (可能函数本身需要进一步完善!)最终,函数会抛出一系列 x 坐标,我们可以尝试绘制它们。

现在让我们在一个示例上测试genXcords 方法。

# load package
library(xts)

# get data
data(sample_matrix)
sample.xts <- as.xts(sample_matrix)

# create line data
y.cords <- genXcords(sample.xts, "2007-05-16", -6, -18)  # note the adjustment!

# plot 
zoo::plot.zoo(sample.xts[,"Close"])
invisible(sapply(y.cords, function(x) lines(x=rep(x, 100), 
                                  y=seq(0, max(sample.xts$Close) + 10, length.out=100), 
                                  col="red", lty=2, lwd=2)))

我手动调整了tadjladj 参数,直到只有一条垂直线出现在正确的位置。这导致了下面的情节。

注意:很遗憾,我无法让它与 FTSE 数据一起使用。但原则上,正如人们所看到的那样,它是有效的,而不是删除我的代码,我把它放在这里。

【讨论】:

    【解决方案3】:

    这是一个有趣的问题。这是我的解决方法。我把行索引做成一列,然后我把图翻译成ggplot,这样我就可以对图有更多的控制权。如果代码中的任何内容不明确,请告诉我。

    library(tidyverse)
    library(quantmod)
    
    getSymbols("^FTSE", src="yahoo", from=as.Date('2004-01-01'), 
               to=as.Date('2013-01-01'), periodicity="weekly")
    
    FTSE %>%
      as.data.frame() %>%
      rownames_to_column("date") %>%
      mutate(date = lubridate::ymd(date)) %>%
      ggplot(aes(date,FTSE.Close ))+
      geom_line()+
      geom_vline(xintercept = as.Date('2008-01-01'), col="red")+
      scale_y_continuous(breaks = scales::pretty_breaks(6), 
                         sec.axis = sec_axis(trans = ~., breaks = scales::pretty_breaks(6)))+
      scale_x_date(date_labels = "%b %d %Y", date_breaks = "2 years")+
      ggtitle("FTSE.Close",subtitle = "2014-01-01/2012-12-27")+
      theme(axis.title = element_blank(),
            axis.line.x = element_line(colour = "black"),
            axis.ticks.x = element_line(colour = "black"),
            axis.line.y = element_blank(),
            axis.ticks.y = element_blank(),
            panel.background = element_blank(),
            panel.grid.major = element_line(colour = "gray"))
    

    【讨论】:

      【解决方案4】:

      或者,我们将不得不使用xts::addEventLines

      实际上在 2015 年 2 月有一个 issue opened at github abline 根本无法与新的 plot.xts 一起使用,我们应该使用替代方案。

      library(quantmod)
      getSymbols("^FTSE", src="yahoo", from=as.Date('2004-01-01'), 
                 to=as.Date('2013-01-01'), periodicity="weekly")
      
      plot(FTSE$FTSE.Close)
      # abline(v='2008-01-01', col="red")  # won't work
      
      # alternative
      events <- xts("", as.Date("2008-01-01"))
      addEventLines(events, col="red", lwd=2)
      

      结果

      注意: 也可以定义多个事件行,例如events <- xts(letters[1:3], as.Date(c("2008-01-01", "2009-01-01", "2010-01-01"))) .

      【讨论】:

      • 我想知道为什么在网上很难找到这些信息。干得好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2015-11-01
      • 2021-07-09
      • 2011-05-26
      • 1970-01-01
      相关资源
      最近更新 更多