2009-12-16 30 views
9

In R (statistische Computing-Umgebung) möchte ich auf einem generischen Diagramm, mit Zeit auf der x-Achse, bestimmte Jahre markieren.Hervorhebung bestimmter Werte in R-Plot

Wie kann ich das am besten tun? Meine Idee ist zum Beispiel ein hellgelber Balken für die hervorgehobenen Jahre, natürlich hinter der Handlung.

Die Handlung Code Ich habe jetzt:

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

Wo Temperatur $ bigEmdIm5 die Ausgabe von empirischen Modus Zerfall ist. Die Daten sind in Monaten, also möchte ich zum Beispiel 01/1950 bis 12/1950 higlight.

+0

Können Sie die Daten bitte irgendwo ablegen oder einen Befehl hinzufügen, um ein mock data.frame zu erstellen, damit wir Ihnen wirklich helfen können? –

+1

Wenn Ihre X-Achsen-Daten von der Klasse POSIXct sind, dann sollte der Aufruf von 'axis (side = 1, at = tickpos)' erfolgen und ist ein besseres Idiom, als explizit einen Versand zu erzwingen. –

+0

rcs: Hm, vielleicht bin ich von zu viel "zoo" und "xts" verwöhnt. Scheitert es auch, wenn Sie "Date" statt der höheren Auflösung verwenden. 'POSIXct'? Wie auch immer, danke für das Heads-up! –

Antwort

11

Mit Alpha-Transparenz:

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

oder Grundstück markierten Bereich hinter Linien :

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

können Sie verwenden, um die chartSeries() Funktion in quantmod mit einer xts Zeitreihe und die addTA() Funktion des Hintergrund Hervorhebung hinzugefügt:

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

Für diese Lösung müsste ich meinen Plotbefehl ändern Ich denke –

+1

Wenn Sie eine bestimmte Antwort möchten, müssen Sie mehr Details angeben. Wie lautet der Befehl zum Plotten? – Shane

+0

Ich aktualisiere meine Frage mit meinen aktuellen Plot-Befehlen –

5

Hier ist eine Lösung, die zoo einfach verwendet, weil das die Untergruppe einfach macht. Sie könnten das gleiche mit Standard-Indizierung auch tun:

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

Durch die Verwendung von par("usr") wir die Notwendigkeit einer expliziten Werte für die oberen und unteren Bereich Marken zu vermeiden. Und die Indexierung zoo erleichtert das Finden der Start- und Endpunkte. Dies würde für Daten in unterschiedlichen Zeitauflösungen genauso funktionieren.

Verwandte Themen