Подсветить (заштриховать) сюжетный фон в определенном временном диапазоне
На общем графике со временем по оси X я хотел бы выделить период в несколько конкретных лет.
Как я могу лучше всего это сделать? Моя идея, например, светло-желтая полоса для выделенных лет, конечно же, за сюжетом.
Сюжетный код у меня сейчас:
pdf("temperature_imfs_big_interm5.pdf", width=6, height=8);
par(mfrow=c(temperature$bigEmdIm5$nimf+1,1), mar=c(2,1,2,1))
for(i in 1:temperature$bigEmdIm5$nimf) {
plot(timeline$big, temperature$bigEmdIm5$imf[,i], type="l", xlab="", ylab="", ylim=range(temperature$bigEmdIm5$imf[,i]), axes=FALSE, main=paste(i, "-th IMF", sep=""))#; abline(h=0)
axis.POSIXct(side=1, at=tickpos$big)
}
plot(timeline$big, temperature$bigEmdIm5$residue, xlab="", ylab="", axes=FALSE, main="residue", type="l")
axis.POSIXct(side=1, at=tickpos$big)
dev.off();
Где температура $ bigEmdIm5 является выходом эмпирического режима разложения. Данные даны в месяцах, поэтому я хотел бы выделить 01/1950 до 12/1950, например.
Ответы
Ответ 1
Использование альфа-прозрачности:
x <- seq(as.POSIXct("1949-01-01", tz="GMT"), length=36, by="months")
y <- rnorm(length(x))
plot(x, y, type="l", xaxt="n")
rect(xleft=as.POSIXct("1950-01-01", tz="GMT"),
xright=as.POSIXct("1950-12-01", tz="GMT"),
ybottom=-4, ytop=4, col="#123456A0") # use alpha value in col
idx <- seq(1, length(x), by=6)
axis(side=1, at=x[idx], labels=format(x[idx], "%Y-%m"))
![enter image description here]()
или построить выделенную область за линиями:
plot(x, y, type="n", xaxt="n")
rect(xleft=as.POSIXct("1950-01-01", tz="GMT"),
xright=as.POSIXct("1950-12-01", tz="GMT"),
ybottom=-4, ytop=4, col="lightblue")
lines(x, y)
idx <- seq(1, length(x), by=6)
axis(side=1, at=x[idx], labels=format(x[idx], "%Y-%m"))
box()
![enter image description here]()
Ответ 2
Вот решение, которое использует зоопарк просто потому, что это упрощает поднаборы. Вы можете сделать то же самое со стандартной индексацией:
## create a long monthly sequence and a sub-sequence
months <- seq( as.Date("1950-01-01"), as.Date("2009-12-12"), by="month")
subset <- seq( as.Date("1970-01-01"), as.Date("1979-12-31"), by="month")
## generate some random values
set.seed(42)
values <- cumsum(rnorm(length(months)))
## plot as a zoo object, overlay a gray background and overplot a line in red
library(zoo)
Z <- zoo(values, months)
plot(Z)
rect(xleft=head(subset,1), xright=tail(subset,1),
ybottom=par("usr")[3], ytop=par("usr")[4],
density=NA, col="lightgray")
lines(Z[subset], col='red')
box()
(источник: eddelbuettel.com)
Используя par("usr")
мы избегаем необходимости явных значений для верхней и нижней меток области. А индексирование в zoo
упрощает поиск start- и конечных точек. Это будет работать одинаково для данных с разным разрешением времени.
Ответ 3
Вы можете использовать функцию chartSeries()
в quantmod
с помощью функции xts
timeSeries и addTA()
, чтобы добавить подсветку фона:
addTA(xts(rep(TRUE,length(times)), times), on=-1, col="#333333", border=NA)