2014-07-04 11 views
5

ProblemDatumsformat für Untergruppe von Zecken auf der Zeitachse

Ich mag meine X-Achse (Zeit) zu formatieren, so dass die Wochenenden deutlich sichtbar sind. Ich möchte sowohl das Datum als auch den Wochentag anzeigen.

aktuelle Situation

ich dies tun mit (vollständige Code unten)

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

die mich

enter image description here

01 Gewünscht Situation gibt

Ich hätte lieber eine Ein-Buchstaben-Abkürzung für die Wochentage, da es dort ein bisschen eng wurde .. Außerdem würde ich gerne die Sonntage (und Feiertage wirklich) in rot färben. Hier ist, was ich meine (mit GIMP). Beachten Sie, wie der erste Montag und am vergangenen Freitag unter Verwendung

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

jedoch hinzugefügt wurden, dann bekomme ich eine Drei-Buchstaben-Abkürzung des Wochentag, die ich in GIMP entfernt.

enter image description here

Hier ist der vollständige Code für dieses Beispiel.

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) 

So zusammenzufassen:

  • Gibt es eine Möglichkeit, bestimmte Brüche in einer anderen Farbe zu färben?
  • Gibt es eine Möglichkeit, die Etiketten manuell zu ändern und sie immer noch für den Montag und den Freitag am Anfang und das Ende in diesem Fall zu haben?
  • Auch wenn es eine Möglichkeit, die Linien jedes Etiketts zentriert zu haben, die genial :)

Danke sein würde!

Antwort

7

Sie können Ihre benutzerdefinierten Formatierer für Etiketten verwenden auch breaks="1 day" Argument, man muss nur function(x) nach labels= und replace myDate$timestamp mit x verwenden. Dies wird auch das dritte Problem lösen.

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

Oder Sie können Ihre Transformation als separate Funktion machen und es dann für labels= verwenden.

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) 

Um Farben für Etiketten ändern Sie theme() und axis.text.x= verwenden sollten. Hier benutze ich einen Vektor von Farben, der 6 mal schwarz und dann rot wie Ihre Skala enthält, beginnend mit Montag. Diese Farben werden dann wiederholt.

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

Hey, das ist sehr schön! Vielen Dank! Es beantwortet nicht die Farbfrage, aber ich mag es trotzdem! – bytesinflight

+0

Schön geschriebene Antwort, saubere Lösung. Danke noch einmal! – bytesinflight

+0

Dies ist eine sehr unterschätzte Antwort, eine wirklich gute :) Paldies – r0berts

Verwandte Themen