Это, вероятно, должно быть выдано в CRAN. (Это уже было выдано в github , решение опубликовано в другом ответе .)
Вот обходной путь.
После этого ответа мы могли бы построить вертикальную константу скорее с lines
, чем с abline
. plot.xts
, который используется при построении объекта "xtx"
, кажется, что он написан с некоторой ошибкой или неаккуратностью, так как он также сигнализирует о наличии комментария в связанном ответе и предлагает вместо этого использовать zoo::plot.zoo
.
Из другого ответа мы узнаем, что мы можем использовать .index()
для извлечения индексов, которые находятся ниже данных, аналогично факторам, где значения лежат ниже меток.
Однако plot.zoo
сокращает даты в соответствии с неизвестным алгоритмом сглаживания (который, вероятно, можно выяснить, если внимательно изучить zoo::plot.zoo
), и наша дата, которую мы строим, может попасть именно в такую "черную дыру". Одним из возможных решений является дать plot.zoo
a 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)
}
, который первым извлекает даты из числовых индексов. Затем он создает последовательность дат, содержащую дату, которая должна быть нанесена где-то внутри. Обратите внимание на параметры настройки tadj
и ladj
, поскольку впоследствии потребуется некоторая подстройка. (Вероятно, сама функция нуждается в дальнейшей доработке!) В конце концов, функция выдает батарею 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)))
Я вручную настраивал параметры tadj
и ladj
, пока в нужном месте не появилась только одна вертикальная линия. Это привело к сюжету ниже.
Примечание: К сожалению, я не смог заставить его работать с данными FTSE
. Но в принципе, как видно, это работает, и вместо того, чтобы удалить мой код, я поместил его здесь.