2012-05-10 5 views
6

J'ai essayé d'étendre my own answer on drawing Gantt Charts à un cas plus général. J'illustre un résultat partiel ici:Tracer un planificateur d'année dans R

Year planner in R

Un certain nombre de voyages sont tracés sur ce tableau, avec les points rouges représentant les départs et les points verts un retour. Maintenant, voici mon défi:

  1. Je voudrais marquer tous les jours entre un départ et un retour avec un point gris, et laisser tous les autres intacts.
  2. Je voudrais que les points soient correctement entourés par les différentes longueurs de mois (par exemple, le départ du 28 juin marquerait les jours jusqu'au 30 juin et ensuite remonterait au 1er juillet).
  3. Le script ne doit pas échouer dans le cas d'un voyage d'une journée (par exemple, le voyage au début de septembre où le départ et le retour ont lieu le même jour et un point vert plus petit sur un marqueur rouge plus grand).

Il est trivial de produire ce graphique avec le code ci-dessous, et il serait facile de joindre les points avec une ligne du rouge au vert où les deux se produisent dans le même mois. Quelqu'un peut-il aider avec le cas d'un enveloppement d'une manière assez générale pour prendre aussi des années bissextiles et non-bissextiles, etc?

library("ggplot2") 

# ---------------- 
# LOAD DATA 

df <- read.table(text='id,dep_month,dep_day,ret_month,ret_day 
c,1,5,1,16 
v,2,1,2,6 
a,3,28,3,31 
z,4,9,4,11 
y,4,25,5,3 
f,6,28,7,7 
w,8,19,8,29 
b,9,9,9,9 
k,9,29,10,6 
n,11,20,12,3', header = TRUE, 
       sep = ',') 

# ---------------- 
# DRAW YEAR CHART 

p <- ggplot(data = df, 
      aes(x = dep_day, 
       y = dep_month 
       ) 
      ) 
p <- p + theme_bw() 
p <- p + geom_point(colour = 'red', 
        size = 6) 
p <- p + geom_point(aes(x = ret_day, 
         y = ret_month 
         ), 
        colour = 'green', 
        size = 4 
        ) 
p <- p + scale_x_continuous(breaks = c(1:31)) 
p <- p + scale_y_reverse(breaks = c(1:12)) 
p <- p + ylab("Month") + xlab("Day") 
print(p) 

Répondre

5

Probablement pas la solution parfaite, mais pense obtenir beaucoup plus facile, lorsque vous utilisez date objets:

# using your data.frame 
# create date object using the dep_month, dep_day etc columns 
df$dep.date = as.Date(paste('2012', df$dep_month, df$dep_day, sep='-')) 
df$ret.date = as.Date(paste('2012', df$ret_month, df$ret_day, sep='-')) 

# calculate the dates for the gray data points between departure and return 
# there is probably a more R'ish ways, than a for loop 
days <- NULL 
for(i in seq(1, nrow(df))){ 
    tmp <- seq.Date(df[i,]$dep.date, df[i,]$ret.date, by='days') 
    days <- rbind(days, 
     data.frame(day = as.POSIXlt(tmp)$mday, 
      mon = as.POSIXlt(tmp)$mon+1)) 
} 

# plot it 
p <- ggplot(days, aes(day, mon)) + geom_point(colour='gray66') + theme_bw() + 
geom_point(data = df, aes(dep_day, dep_month), colour = 'red', size = 6) + 
geom_point(data = df, aes(ret_day, ret_month), 
       colour = 'green', size = 4) + 
scale_x_continuous(breaks = c(1:31)) + 
scale_y_reverse(breaks = c(1:12)) + 
ylab("Month") + xlab("Day") 
print(p) 

enter image description here

+1

Merci, @smu, qui est le plus élégant, beaucoup mieux que tous mes efforts. – gauden

Questions connexes