2013-08-30 8 views
5

mit xyplot aus dem lattice Paket, plotte ich eine Zeitreihe über eine Reihe von Jahren. Ich würde für einige dieser Jahre einen schattierten Bereich hinzufügen, um anzuzeigen, dass dieser Zeitraum "speziell" war (z. B. Krieg).Wie schattierten Hintergrund in xyplot in R bekommen?

Bitte Entschuldigen Sie, wenn das trivial ist, aber ich konnte nicht herausfinden, wie das geht, also würde ich mich freuen, wenn mir jemand helfen könnte, oder zumindest in die richtige Richtung zeigen. Ich denke, mein Hauptproblem ist, dass ich nicht wirklich weiß, wie ich dieses Problem angehen soll. Ich bin immer noch relativ neu für R und insbesondere für lattice.

hier ein minimales Beispiel:

xyplot(rnorm(100) ~ 1:100, type="l", col="black") 

In dem entsprechenden Grundstück, würde ich die Farbe des Hintergrunds wie (von etwa x -Werten von 45 bis 65) von unten nach oben auf dem Plottingbereich etwa hellgrau schattiert sein.

Beachten Sie, dass Lösungen, die ich bisher base Grafiken verwenden gefunden haben und die polygon -function, doch die Absicht, Schatten ist die Fläche unter oder über einer Kurve, die sich von dem unterscheidet, was Ich mag würde tun. Ich möchte nicht nur den Bereich unter meiner Linie oder über meiner Linie beschatten. Stattdessen möchte ich den gesamten Hintergrund für ein bestimmtes Zeitintervall schattieren.

Wenn mir hier jemand helfen könnte, wäre ich sehr dankbar!

Antwort

8

Siehe ?panel.xblocks im latticeExtra Paket:

library(latticeExtra) 
x <- 1:100 
xyplot(rnorm(100) ~ x, type="l", col="black") + 
     layer_(panel.xblocks(x, x > 20, col = "lightgrey")) 

enter image description here

+0

erscheint ziemlich mächtig. 'y = x> 45 & y <0 'bekommt Sie graue Bänder links von x = 45, aber nur wo y <0. Ich glaube, du hast dich für 'layer_' entschieden, weil es einen Standardwert von 'unter = TRUE' hat? –

+1

Es schien nur ziemlich geschickt und ggplot2-ish, aber alternativ könnte man es in einer herkömmlichen Panel-Funktion verwenden: xyplot (rnorm (100) ~ x, type = "l", col = "schwarz", panel = function (x, ...) {panel.xblocks (x, x> 20, col = "hellgrau"); panel.xyplot (x, ...)}) '. –

3

Dieses versuchen:

xyplot( 
    rnorm(100) ~ 1:100, type="l", col="black", 
    panel=function (x,y,...){ 
    panel.rect(xleft=45, xright=65,ybottom=-3, ytop=3,col="grey") 
    panel.xyplot(x,y,...) 
    } 
) 

Die panel.rect() Funktion steuert das Rechteck und die Gitter Äquivalent der rect() Funktion. Es hat eine Vielzahl von Einstellungen, die Sie nützlich finden können. Es heißt zuerst und dann wird die xyplot() oben drauf gesetzt. Sie müssen viel herumspielen, um Ihre ybottom und ytop Parameter zu sehen, wie Sie sie mögen.

+0

Wow, danke Jungs, das war schnell. Deine Lösungen helfen mir auf jeden Fall. Sie bringen mir auch ein paar neue Dinge bei, weshalb ich diese Website liebe! Ich hoffe, irgendwann werde ich genug beherrschen, um hier selbst etwas beizutragen! Danke und habe ein schönes Wochenende! – coffeinjunky

3
trellis.focus("panel", 1, 1) 
grid.rect(x =.55, , y=.5, w = .2, height=6, 
    gp = gpar(fill = "light grey")) 
trellis.unfocus() 

Dies unterscheidet sich von @ JohnPauls Lösung auf mehrere Arten (und ich denke, seine Antwort ist besser). Dies verwendet die Mitte des gewünschten X-Bandes zur Platzierung in "nativen Koordinaten" und berechnet die Breite als "Bereich (xlim)/Bereich (Band)" und modifiziert eine existierende Kurve. Die grid.rect-Funktion ist die untere Funktion der Gitterpakete, die von panel.rect verwendet wird. Manchmal finde ich das nützlich, wenn ich Gitterpaneele in das System integriere.