2009-12-16 21 views
9

In R (ambiente di calcolo statistico) Vorrei un grafico generico, con il tempo sull'asse x, evidenziare alcuni anni specifici.Evidenziazione di valori specifici nel grafico R

Come posso fare al meglio? La mia idea è ad esempio una barra giallo chiaro per gli anni in evidenza, dietro la trama ovviamente.

Il codice trama che ho ora:

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(); 

Dove temperatura $ bigEmdIm5 è l'uscita della modalità di disintegrazione empirica. I dati sono in mesi, quindi vorrei higlight 01/1950 fino al 12/1950 per esempio.

+0

Potete per favore inserire i dati da qualche parte, o aggiungere un comando per creare un mock data.frame in modo che possiamo effettivamente aiutarvi? –

+1

Inoltre, se i dati dell'asse x sono di classe POSIXct, allora chiamare "axis (side = 1, at = tickpos)" dovrebbe essere ed è un idioma migliore piuttosto che forzare esplicitamente un invio. –

+0

rcs: Hm, forse sono rovinato da troppo 'zoo' e' xts'. Fallisce anche quando usi 'Date' anziché la risoluzione più alta. 'POSIXct'? Comunque, grazie per l'heads-up! –

risposta

11

Utilizzando trasparenza alfa:

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")) 

o regione trama evidenziata dietro le linee :

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() 

plot output http://img341.imageshack.us/img341/7292/rect.png

1

È possibile utilizzare la funzione chartSeries() in quantmod con una xts TimeSeries e la funzione addTA() per aggiungere lo sfondo evidenziando:

addTA(xts(rep(TRUE,length(times)), times), on=-1, col="#333333", border=NA) 
+0

Per questa soluzione, dovrei modificare il comando di stampa. Immagino che sia –

+1

Se si desidera una risposta specifica, è necessario fornire maggiori dettagli. Qual è il tuo comando di plottaggio? – Shane

+0

Aggiorna la mia domanda con i miei attuali comandi di stampa –

5

Ecco una soluzione che utilizza zoo semplicemente perché semplifica il sottotitolo. Si potrebbe fare lo stesso con indicizzazione standard così:

## 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() 

alt text http://dirk.eddelbuettel.com/misc/plotRegionExample.png

Utilizzando par("usr") evitiamo la necessità di valori espliciti per i marchi regione superiore e inferiore. Inoltre, l'indicizzazione zoo semplifica la ricerca degli endpoint e degli endpoint. Ciò funzionerebbe allo stesso modo per i dati in diverse risoluzioni temporali.

Problemi correlati