2014-07-04 18 views
5

ProblemData Format dla podzbioru kleszczy na osi czasu

Chciałbym sformatować oś X (czas) tak, że weekendy są wyraźnie widoczne. Chciałbym wyświetlić zarówno datę, jak i dzień tygodnia.

Obecna sytuacja

zrobić to z pełnego kodu (poniżej)

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

który daje mi

enter image description here

kupna sytuację

Wolałbym mieć jednoliterowy skrót w dni powszednie, ponieważ stał się tam nieco ciasny. Poza tym chciałbym pokolorować niedziele (i święta naprawdę) na czerwono. Oto co mam na myśli (wykonane z GIMP). Zauważ, że pierwszy poniedziałek i ostatni piątek dodano za pomocą

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

Jednak potem dostać skrót trzy List dni powszednie, które usunąłem w GIMP-ie.

enter image description here

Oto pełna kodu tego przykładu.

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) 

Więc Podsumowując:

  • Czy istnieje sposób, aby kolor konkretnych przerw w innym kolorze?
  • Czy istnieje sposób zmiany etykiety ręcznie i nadal mają one w poniedziałek i piątek na początku i na końcu w tym przypadku?
  • Ponadto, jeśli istnieje sposób, aby linie każdej etykiecie środku, to byłoby niesamowite :)

Dziękujemy!

Odpowiedz

7

Można użyć niestandardowego formater etykiet również używając breaks="1 day" argumentu, po prostu trzeba użyć function(x) po labels= i replace myDate$timestamp z x. To rozwiąże także trzeci problem.

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

Albo można dokonać transformacji jako oddzielną funkcję, a następnie użyć go do 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) 

Aby zmienić kolory na etykietach należy użyć theme() i axis.text.x=. Tutaj używam wektora kolorów zawierającego 6-krotnie czarnego, a następnie czerwonego, gdy twoja skala zaczyna się od poniedziałku. Te kolory są następnie powtarzane.

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

Hej, to bardzo miłe! Dzięki! Nie odpowiada na pytanie o kolor, ale tak naprawdę to lubię! – bytesinflight

+0

Ładnie napisane odpowiedź, czyste rozwiązanie. Dzięki jeszcze raz! – bytesinflight

+0

To jest bardzo niedoceniona odpowiedź, naprawdę dobra :) Paldies – r0berts