2015-07-20 1 views
3

Ce code:Fond ombré de ggplot selon le mois

df <- data.frame(day <- 0:365, value = 1) 
library(ggplot2) 
ggplot(df, aes(day, value)) + geom_blank() + scale_x_continuous(breaks = seq(0, 365, 10)) + theme_bw() 

génère ce terrain:

enter image description here

En utilisant le code R, je veux à l'ombre l'arrière-plan de l'intrigue selon laquelle day tombe dans quel mois. Je veux que l'intrigue ressemble à ci-dessous (l'arrière-plan de l'intrigue est Photoshopped). Je serais particulièrement intéressé par une solution qui utilise lubridate.

enter image description here

Répondre

2

Probablement pas optimale, mais je pense que cela va fonctionner pour vous:

df <- data.frame(day = 1:365, value = 1) 
#do some data manipulation. Calculate as date 
df$date <- as.Date(df$day, origin="2014-12-31") 
str(df) 

df$month <- month(df$date) 
df$month_name <- month(df$date,label=T) 
#calculate color 
df$month_color <- ifelse(df$month %% 2,"black","white") 

#make plot using geom_bar and scale_fill/colour_identity() 
plot2 <- ggplot(df, aes(x=day, y=value)) + 
    geom_bar(stat="identity",aes(fill=month_color,color=month_color))+ 
    scale_fill_identity() + 
    scale_color_identity() + 
    scale_x_continuous(breaks = seq(0, 365, 10)) + 
    theme_bw() + 
    theme(panel.grid=element_blank()) 

#make data for plotting months as geom_txt 
month_df <- do.call(rbind,lapply(split(df,df$month_name),function(x){ 
    return(x[1,]) 
})) 
month_df 

plot2 + geom_text(data=month_df, aes(x=day+15, y=value-0.05, label=month_name),color="red") 

Result

6

est ici une partie de la solution en utilisant geom_raster.

library(lubridate) 
library(ggplot2) 

x <- seq(from = as.Date("2000/1/1"), to = as.Date("2000/12/31"), "day") 
xy <- data.frame(datum = x, day = day(x), month = month(x), seq.day = 1:length(x), 
       month.ind = rep(rep(0:1, 6), times = rle(xy$month)$lengths)) 

ggplot(xy, aes(x = seq.day, y = 1, fill = as.factor(month.ind))) + 
    theme_bw() + 
    scale_fill_manual(values = c("black", "white")) + 
    scale_x_continuous(breaks = seq(0, 365, 10)) + 
    geom_raster(alpha = 0.3, show_guide = FALSE) 

enter image description here

+1

On dirait qu'il est temps d'acheter un écran plus large ... :) –