2013-08-07 24 views
7

Z danych meteorologicznych (godzinowe wartości temperatury, wiatru i wilgotności) udało mi się wykreślić serie czasowe prędkości i kierunku wiatru. Teraz chciałbym dodać wektory wiatru na wykresie szeregu czasowego. Tutaj możesz zobaczyć wyniki, które chciałbym (strzałki narysowane na faktycznym wykresie).ggplot2 seria czasowa wiatru ze strzałkami/wektorami

enter image description here

Używam ggplot2, zostały pominie stackoverflow, ggplot2 docs pakietów (nadal będzie), ale nie znaleziono rozwiązanie. Każdy pomysł lub wskazówka, gdzie szukać, byłby punktem wyjścia.

góry dzięki

EDIT PYTANIE Jak sugeruje w komentarzu przez @slowlearner dodam tutaj kod i dane, aby wykonać powtarzalne przykład. Wygląda na to, że geom_segment może załatwić sprawę. Udało mi się obliczyć yend w geom_segment, ale nie mogę znaleźć sposobu znalezienia xend, ponieważ oś x jest osią czasu. Mam dane prędkości i kierunku wiatru, więc mogę obliczyć komponenty wiatrowe x, y dla geom_segment, ale x musi zostać przekonwertowany na format czasu.

Oto kod używany do działki (temperatury) i data

for (i in 1:2) { 

rams=subset(data,data$stat_id %in% i) 
tore=subset(torre,torre$stat_id %in% i) 

# Gràfica en ggplot 

# Gráfica de evolución temporal de las estaciones de la zona 

gtitol=places$nom[places$stat_id == i] 

myplot=ggplot(data=rams,aes(x=datetime, y=tempc, colour="RAMS")) + 
    geom_line() + ylab("Temperatura (ºC)") + xlab(" ") + 
    ggtitle(gtitol) + theme(legend.title=element_blank()) + theme(legend.position="bottom") + 
    scale_y_continuous(limits = c(0,40)) + 
    geom_line(data=tore,aes(x=datetime,y=temp,colour = "Torre")) 
#scale_y_continuous(breaks = round(seq(min(data$tempc), max(data$tempc), by = 2),0)) 


ggsave(myplot,filename=paste("RAMS-",i,".png",sep=""),width=7.78,height=5.79) 

} 

Po geom_segment docs Próbowałem

p=ggplot(tore, aes(x =datetime, y = 5)) 
p + geom_segment(aes(xend = datetime, yend = 5 + v), arrow = arrow(length = unit(0.1,"cm"))) 

Pierwsze tego rodzaju figury. Możesz zobaczyć współrzędną x jest datetime, w jaki sposób powinienem przekonwertować komponent wiatru, aby uzyskać xend? Teraz xKoniec równa datetime ale chciałbym coś jak „datetime + xwindcomp”

enter image description here

Dzięki za pomoc

+2

Zobacz "geom_segment' i zauważ, że ma on argument" strzałki ". – joran

+1

Wyewidencjonuj calenderPlot() z pakietu open air, może to być pomocne, nawet jeśli nie tworzy szeregów czasowych. – eliavs

+1

'geom_segment (aes (x = 0, y = 0, xend = xend, yend = 0), linia, strzałka = strzałka (typ =" zamknięty ", kąt = 23), kolor =" czerwony ", rozmiar = 1.0) 'jest tym, czego używam do narysowania strzałki na wykresie ggplot. Czy to właśnie powinieneś wiedzieć? Btw: 'strzałka' jest funkcją w pakiecie' grid'. – ROLO

Odpowiedz

3

Podobnie jak w preambule, upewnij się, że zawierają wszystkie dane kodu i znaczenie w przyszłości pytania. Jeśli spojrzysz na swoje pytanie powyżej, zobaczysz, że niektóre obiekty, takie jak torre, nie są zdefiniowane. Oznacza to, że nie możemy kopiować i wklejać do naszych ustawień R. Również danych, z którymi się łączyłeś, nie można użyć z kodem w pytaniu, ponieważ był to ograniczony podzbiór. Moja rada: (a) twórz fałszywe dane, które wyglądają jak dane, z których korzystasz (b) utrzymuj swój kod w absolutnym minimum (c) i dwukrotnie sprawdź kod i dane w nowej sesji R przed opublikowaniem .

O ile mogę powiedzieć, chcesz coś takiego jak poniżej. Oczywiście będziesz musiał dostosować go do własnych celów, ale powinien dać ci kilka pomysłów, jak rozwiązać problem. Zauważ, że większość cech kosmetycznych, takich jak kolory linii, grubości, legendy i tytuły zostały pominięte na wykresie: nie są one ważne dla celów tego pytania. EDYCJA Innym podejściem może być użycie tej samej ramki danych dla danych wiatru, a następnie użycie zmiennej faceting, aby pokazać prędkość na innym, ale połączonym wykresie.

require(ggplot2) 
require(scales) 
require(gridExtra) 
require(lubridate) 
set.seed(1234) 

# create fake data for temperature 
mydf <- data.frame(datetime = ISOdatetime(2013,08,04,0,0,0) + 
        seq(0:50)*10*60, 
        temp = runif(51, 15, 25)) 

# take a subset of temperature data, 
# basically sampling every 60 minutes 
wind <- mydf[minute(mydf$datetime) == 0, ] 
# then create fake wind velocity data 
wind$velocity <- runif(nrow(wind), -5, 20) 
# define an end point for geom_segment 
wind$x.end <- wind$datetime + minutes(60) 

ggplot(data = mydf, aes(x = datetime, y = temp, group = 1)) + 
    geom_line() + 
    geom_segment(data = wind, 
       size = 3, 
       aes(x = datetime, 
        xend = x.end, 
        y = 10, 
        yend = velocity), 
       arrow = arrow(length = unit(0.5, "cm"))) + 
    theme() 

Wytwarza się następujący wykres: screenshot

+0

Dzięki @slowlearner Działa świetnie, dokładnie to, czego szukałem. Przepraszam za dane, uważam, że wystarczyło danych użytych w pętli do wykreślania. Chciałem tylko uniknąć wcześniejszych poleceń formatowania danych. Postaraj się zrobić najlepiej następnym razem i jeszcze raz dzięki. – pacomet

0

obliczyć kierunek wiatru za pomocą stopni dziesiętnych. Zakładając, że chcesz, aby 0 stopni było Północą (w górę), użyj następującego:

ggplot(data = wind, aes(x=datetime, y=temp)) + 
    geom_text(aes(angle=-wind_dir_degrees+90), label="→")