2017-10-20 6 views
1

Je veux faire quelque chose comme un tracé de calendrier, mais avec des heures sur un mois (au lieu de jours sur un an). J'ai réussi à le faire avec ggplot, mais les données sont remplies dans le mauvais ordre.ggplot remplit les données dans le mauvais ordre

J'ai fait cet exemple reproductible:

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) 

)

Ceci est seulement un exemple pour montrer mon problème. Comme vous pouvez le voir, les jours en eux-mêmes sont corrects (le premier décembre était un jeudi, le 31 décembre était un samedi), mais les données sont remplies incorrectement (verticalement au lieu d'être horicontal).

Qu'est-ce que je fais mal?

Here you can see the result

+2

Lorsque vous utilisez 'ggplot()' fonction, vous devez faire référence à votre colonne juste en leur nom - repalce 'fill = dat [2]' 'avec fill = test'. –

Répondre

5

Il est probablement plus facile à utiliser facet_grid à la place.

Voir également les variables par leur nom! Donc, utilisez test et non dat[2].

Si vous ne connaissez pas le nom de la variable et devez le définir par programme, utilisez aes_string ou aes_ à la place.

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