2014-12-09 8 views
9

Załóżmy, że mam działkę takiego:Opisywanie pierwszy miesiąc roku w ggplot2

DF <- data.frame(date=Sys.Date() - (-100):100, y=rnorm(201)) 
library("ggplot2") 
library(scales) 
ggplot(DF, aes(x=date, y=y)) + 
geom_point() + 
scale_x_date(breaks = "1 month", minor_breaks = "1 week", labels=date_format("%b")) 

Tutaj chcę obejmują główne linie i etykiety na każdy miesiąc i drobnych linii w każdym tygodniu. To działa dobrze, ale teraz chciałbym włączyć rok za skróconym miesiącem, ale tylko na pierwszy miesiąc tego roku w działce. Tak więc etykiety powinny być przeczytane w sep 2014. okt, nov, dec, jan 2015, feb, mrt ....

Czy to możliwe?

Odpowiedz

12

Można to zrobić z datą zwyczaj formater do usuwania duplikatów lat:

my_date_format <- function() 
{ 
    function(x) 
    { 
     m <- format(x,"%b") 
     y <- format(x,"%Y") 
     ifelse(duplicated(y),m,paste(m,y)) 
    } 
} 

ggplot(DF, aes(x=date, y=y)) + 
geom_point() + 
scale_x_date(breaks = "1 month", minor_breaks = "1 week", labels=my_date_format()) 

Custom date plot

+1

Nice one! Jeśli zmienisz funkcję zwracając 'ifelse (zduplikowane (y), m, wklej (m, y)) unikniesz dodatkowej przestrzeni pod koniec miesiąca (co powoduje, że nie są dokładnie wyśrodkowane pod tyknięciem znaki). – konvas

+0

@konvas Dobry punkt. – James

+0

Awesome! Dzięki! –