2014-07-04 5 views
5

Problemaformato di data per il sottoinsieme di zecche sull'asse tempo

vorrei formattare il mio asse X (tempo) in modo che i fine settimana sono chiaramente visibili. Vorrei visualizzare la data e il giorno della settimana.

Situazione attuale

Lo faccio con (codice completo di seguito)

scale_x_date(breaks=myData$timestamp, 
    labels=paste(
    substr(format(myData$timestamp, "%a"),1,1), 
    format(myData$timestamp, "%d"), 
    sep="\n") 
) 

che mi dà

enter image description here

situazione carente

Preferisco avere un'abbreviazione di una lettera per i giorni feriali da quando è diventato un po 'stretto lì .. Inoltre, mi piacerebbe colorare la domenica (e le vacanze davvero) in rosso. Ecco cosa intendo (realizzato con GIMP). Si noti come il primo Lunedi e Venerdì scorso è stato aggiunto utilizzando

scale_x_date(breaks = "1 day", 
    minor_breaks = "1 days", 
    labels = date_format("%a\n%d"), 
    name="") 

Tuttavia, allora ottengo un'abbreviazione di tre lettere dei giorni della settimana, che ho rimosso in GIMP.

enter image description here

Ecco il codice completo per questo esempio.

library(ggplot2) 
library(scales) 
library(reshape2) 

minimumTime <- as.Date("2014-07-01") 
maximumTime <- as.Date("2014-07-31") 

x <- seq(minimumTime,maximumTime, by="1 day") 
y1 <- sin(as.numeric(x)/3) 
y2 <- cos(as.numeric(x)/3) 

myData <- data.frame(timestamp=x, y1=y1, y2=y2) 
myData <- melt(myData, id.vars="timestamp") 

rects <- data.frame(saturdays=myData[weekdays(myData$timestamp) == "Saturday","timestamp"]-0.5, sundays = myData[weekdays(myData$timestamp) == "Saturday","timestamp"]+1.5) 

myPlot <- ggplot() + 
    geom_rect(data=rects, aes(xmin=saturdays, xmax=sundays,ymin=-Inf, ymax=Inf), alpha=0.1) + 
    geom_line(data=myData, aes(x=timestamp, y=value, colour=variable,size=1)) + 
    geom_point(data=myData, aes(x=timestamp, y=value, colour=variable,size=2)) + 
    scale_x_date(breaks=myData$timestamp, labels=paste(substr(format(myData$timestamp, "%a"),1,1),format(myData$timestamp, "%d"),sep="\n")) + 
    #scale_x_date(breaks = "1 day", minor_breaks = "1 days", labels = date_format("%a\n%d"), name="") + 
    scale_size_continuous(range = c(1.5,5), guide=FALSE) 

Quindi per riassumere:

  • Esiste un modo per colorare le pause specifici in un altro colore?
  • C'è un modo per cambiare le etichette manualmente e conservarle per il lunedì e il venerdì all'inizio e la fine in questo caso?
  • Inoltre, se c'è un modo per avere le linee di ogni etichetta centrato, che sarebbe impressionante :)

Grazie!

risposta

7

È possibile utilizzare il Formater personalizzato per etichette anche usando breaks="1 day" argomento, basta usare function(x) dopo labels= e replace myDate$timestamp con x. Questo risolverà anche il terzo problema.

+ scale_x_date(breaks="1 day", 
     labels= function(x) paste(substr(format(x, "%a"),1,1),format(x, "%d"),sep="\n")) 

Oppure si può fare la vostra trasformazione in funzione separata e poi usarlo per labels=.

my_date_trans<-function(x) { 
     paste(substr(format(x, "%a"),1,1),format(x, "%d"),sep="\n") 
} 

+ scale_x_date(breaks="1 day",labels=my_date_trans) 

per cambiare i colori per le etichette si dovrebbe usare theme() e axis.text.x=. Qui utilizzo il vettore di colori che contiene 6 volte il nero e poi il rosso mentre la scala inizia con il lunedì. Quei colori sono poi ripetuti.

ggplot() + 
     geom_rect(data=rects, aes(xmin=saturdays, xmax=sundays,ymin=-Inf, ymax=Inf), alpha=0.1) + 
     geom_line(data=myData, aes(x=timestamp, y=value, colour=variable,size=1)) + 
     geom_point(data=myData, aes(x=timestamp, y=value, colour=variable,size=2)) + 
     scale_x_date(breaks="1 day",labels=my_date_trans)+ 
     scale_size_continuous(range = c(1.5,5), guide=FALSE)+ 
     theme(axis.text.x=element_text(color=c(rep("black",6),"red"))) 

enter image description here

+1

Ehi, che è abbastanza bello! Grazie! Non risponde alla domanda di colore, ma mi piace molto comunque! – bytesinflight

+0

Risposta ben scritta, soluzione pulita. Grazie ancora! – bytesinflight

+0

Questa è una risposta enormemente poco apprezzata, davvero buona :) Paldies – r0berts