2017-10-20 5 views
1

Ich möchte so etwas wie ein Kalender-Plot, aber mit Stunden über einen Monat (anstelle von Tagen über ein Jahr). Ich habe es mit ggplot geschafft, aber die Daten werden in der falschen Reihenfolge ausgefüllt.ggplot füllt Daten in der falschen Reihenfolge

Ich habe dieses reproduzierbares Beispiel:

library(ggplot2) 
library(scales) 
device <- "test" 
dat <- data.frame(matrix(nrow=31*24, ncol=2)) 
dat[,1] <- seq.POSIXt(from=(as.POSIXct("2016-12-01 00:00:00")), length.out=(31*24), by="1 hour") 
dat[,2] <- seq(from=1, to=nrow(dat), by=1) 
colnames(dat) <- c("Zeit", device) 

dat$month<-as.numeric(as.POSIXlt(dat$Zeit)$mon+1) 
dat$monthf<-factor(dat$month) 
dat$monthf<-factor(dat$month,levels=as.character(1:12),labels=c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),ordered=TRUE) 

dat$week <- as.numeric(format(dat$Zeit,"%W")) 

dat$weekday = as.POSIXlt(dat$Zeit)$wday 
dat$weekdayf<-factor(dat$weekday,levels=(c(1:6,0)),labels=(c("Mon","Tue","Wed","Thu","Fri","Sat","Sun")),ordered=TRUE) 

dat$day <- as.numeric(format(dat$Zeit,"%d")) 
dat$dayf<-factor(dat$day) 

dat$hour <- as.numeric(format(dat$Zeit,"%H")) 
dat$hourf<-factor(dat$hour) 

plot(ggplot(dat, aes(hourf, week, fill = dat[2])) + 
    scale_y_reverse() + 
    geom_tile(colour = "white") + 
    facet_wrap(monthf~weekdayf, ncol=7) + 
    scale_fill_gradientn(colours=c("darkgreen", "green", "yellow", "red","darkred"), 
               values=rescale(c(0, 0.25, 0.5, 0.75, 1)), 
               guide="colorbar") + 
    xlab("") + ylab("") + ggtitle(device) 

)

Dies ist nur ein Beispiel meines Problem zu zeigen. Wie Sie sehen können, sind die Tage selbst korrekt (der Dezember war zuerst ein Donnerstag, der 31. Dezember war ein Samstag), aber die Daten werden falsch ausgefüllt (vertikal statt horizontal).

Was mache ich falsch?

Here you can see the result

+2

Bei der Verwendung von 'ggplot()' Funktion sollten Sie nur mit ihrem Namen auf Ihre Spalte verweisen - test' repalce 'füllen = dat [2]' mit 'füllen =. –

Antwort

5

Es ist wahrscheinlich einfacher facet_grid stattdessen zu verwenden.

Siehe auch Variablen nach Namen! Verwenden Sie also test nicht dat[2]. Wenn Sie den Variablennamen nicht kennen und ihn programmgesteuert festlegen müssen, verwenden Sie stattdessen aes_string oder aes_.

ggplot(dat, aes(hourf, 1, fill = test)) + 
    geom_tile(colour = "white") + 
    facet_grid(week~monthf+weekdayf, switch = 'y') + 
    scale_fill_gradientn(colours=c("darkgreen", "green", "yellow", "red","darkred"), 
         values=rescale(c(0, 0.25, 0.5, 0.75, 1)), 
         guide="colorbar") + 
    xlab("") + ylab("") + 
    ggtitle(device) + 
    theme(axis.ticks.y = element_blank(), axis.text.y = element_blank()) 

enter image description here

Verwandte Themen