2012-07-11 7 views
7

Tworzę serię czasów używając ggplot2 w R. Chciałbym wiedzieć, jak pokazać znaczniki w oś x tylko dla oznaczonych miesięcy (np. 07 marca, 08 marca itd.), zachowując pionowe szare linie na każdy miesiąc.Jak powiedzieć ggplot2 R, aby umieścić znaczniki dla niektórych wartości osi x i nadal zachować pionowe linie dla innych wartości

Głównym powodem jest to, że posiadanie znacznika na każdy miesiąc sprawia, że ​​trudno określić, który z nich odpowiada etykietom.

Oto przykład działki:

See how ticks on the x-axis make it hard to know where is each month

Oto linia R za:

ggplot(timeseries_plot_data_mean,aes(as.numeric(project_date)))+ 
    geom_line(aes(y=num_views))+geom_point(aes(y=num_views))+ 
    stat_smooth(aes(y=num_views),method="lm")+ 
    scale_x_continuous(breaks = xscale$breaks, labels = xscale$labels)+ 
    opts(title="Monthly average num views")+xlab("months")+ylab("num views") 

To jest to, co chcieliby, aby wygenerować. Zobacz, jak tyknięcia znajdują się tuż nad etykietą miesiąca, a pionowe linie wciąż tam są wyświetlane co miesiąc.

This is what would like to generate (Inkscape, image editor,strangely replaced the dots for q's

ręcznie edytowany wykres powyżej używając Inkscape'a (ignoruj ​​q'S, Inkscape'a dziwnie otrzymuje kropek dla Q'S)

Odpowiedz

8

jest tu rozwiązaniem za pomocą parametru scale_x_date()minor_breaks. Aby tego użyć, twoje wartości x muszą być klasy Date zamiast numeric.

library(ggplot2) 
set.seed(123) 

x <- seq(as.Date("2007/3/1"), as.Date("2012/4/1"), by = "1 month") 
y <- ((exp(-10 * seq(from=0, to=1, length.out=length(x))) * 120) + 
     runif(length(x), min=-10, max=10)) 

dat <- data.frame(Months=x, Views=y) 

x_breaks <- seq(as.Date("2007/3/1"), as.Date("2012/4/1"), by="1 year") 
x_labels <- as.character(x_breaks, format="%h-%y") 

plot_1 <- ggplot(dat, aes(x=Months, y=Views)) + 
      theme_bw() + 
      geom_line() + 
      geom_point() + 
      scale_x_date(breaks=x_breaks, labels=x_labels, minor_breaks=dat$Months) 

png("plot_1.png", width=600, height=240) 
print(plot_1) 
dev.off() 

plot_1.png

Powiązane problemy