2013-08-30 14 views
5

przy użyciu xyplot z pakietu lattice, planuję szereg czasowy na przestrzeni wielu lat. Chciałbym dodać zacieniony obszar na niektóre z tych lat, aby wskazać, że ten okres był "wyjątkowy" (np. Wojna).Jak uzyskać cieniowane tło w Xyplot w R?

Proszę, przepraszam, jeśli to trywialne, ale nie mogłem wymyślić, jak to zrobić, więc byłbym szczęśliwy, gdyby ktoś mógł mi pomóc, lub przynajmniej wskazać mi właściwy kierunek. Myślę, że moim głównym problemem jest to, że tak naprawdę nie wiem, jak podejść do tego problemu. Nadal jestem względnie nowy dla R, a zwłaszcza dla lattice.

tu minimalny przykład:

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

W tym samym wykresie, ja jak kolor tła (od powiedzmy x -values ​​o 45, aż do 65) od dołu do góry kreślenia być zacienionym, powiedzmy, jasnoszarym.

Należy zauważyć, że rozwiązania, które znalazłem do tej pory korzystać base grafiki i polygon -function, ale intencją jest cieniu obszar pod lub nad krzywą, która różni się od tego, co chciałbym robić. Nie chcę "tylko" zacieniać obszaru poniżej linii lub powyżej linii. Zamiast tego chciałbym zacienić całe tło dla danego przedziału czasowego.

Jeśli ktokolwiek mógłby mi pomóc, byłbym bardzo wdzięczny!

Odpowiedz

8

Zobacz ?panel.xblocks w pakiecie latticeExtra:

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

Wygląda raczej potężnie. 'y = x> 45 & y <0' powoduje wyświetlenie szarego pasma po lewej stronie x = 45, ale tylko wtedy, gdy y <0. Myślę, że zdecydowałeś się użyć 'layer_', ponieważ ma on domyślną wartość' under = TRUE'? –

+1

Po prostu wydawało się dość sprytne i ggplot2-ish, ale na przemian można go używać w konwencjonalnej funkcji panelu: 'xyplot (rnorm (100) ~ x, typ =" l ", col =" czarny ", panel = funkcja (x, ...) {panel.xblocks (x, x> 20, col = "lightgrey"); panel.xyplot (x, ...)}) '. –

3

Spróbuj:

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,...) 
    } 
) 

Funkcja panel.rect() steruje prostokąta i jest odpowiednikiem kraty funkcji rect(). Ma wiele ustawień, które mogą okazać się przydatne. Nazywa się go najpierw, a następnie umieszcza się na nim xyplot(). Wiele osób musi się trochę rozegrać, aby parametry wyglądały tak, jak je lubisz.

+0

Wow, dzięki chłopaki, to było szybkie. Twoje rozwiązania zdecydowanie mi pomogą. Uczą mnie także nowych rzeczy, dlatego uwielbiam tę stronę! Mam nadzieję, że w pewnym momencie będę wystarczająco biegły, aby samemu wnieść swój wkład! Dzięki i życzę miłego weekendu! – coffeinjunky

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

To różni się od rozwiązania @ JohnPaul na kilka sposobów (i myślę, że jego odpowiedź jest lepsza). Wykorzystuje to środek żądanego pasma X do umieszczenia w "natywnych współrzędnych" i oblicza szerokość jako "zakres (xlim)/zakres (pasmo)" i modyfikuje istniejący wykres. funkcja grid.rect to funkcja niższego poziomu pakietów grid używana przez panel.rect. Czasem wydaje mi się to przydatne, gdy integruję panele kratowe wewnątrz systemu xyplot pokonując mnie.

Powiązane problemy