2012-05-10 11 views
6

ho cercato di estendere my own answer on drawing Gantt Charts a un caso più generale. Illustriamo risultato parziale qui:Tracciando un pianificatore anno in R

Year planner in R

Un numero di viaggi sono tracciati su questo grafico, con i punti rossi rappresentano partenze, ei punti verdi un ritorno. Ora ecco la mia sfida:

  1. Vorrei segnare tutti i giorni tra una partenza e un ritorno con un punto grigio e lasciare intatti tutti gli altri.
  2. Vorrei i punti per avvolgere correttamente attorno al differente durata dei mesi (ad esempio la partenza 28 giugno avrebbe segnato i giorni fino al 30 giugno e poi avvolgere intorno al 1 ° luglio).
  3. Lo script non dovrebbe fallire nel caso di un viaggio di un giorno (ad esempio il viaggio all'inizio di settembre in cui partenza e ritorno avvengono nello stesso giorno e una più piccola punto verde è tracciata su un pennarello rosso più grande).

È semplice produrre questo grafico con il codice seguente e sarebbe facile unire i punti con una linea dal rosso al verde dove entrambi si verificano nello stesso mese. Chiunque può aiutare con il caso di un involucro intorno in modo generale abbastanza da assumere anche saltare e anni non bisestili, ecc?

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) 

risposta

5
non

Probabilmente la soluzione perfetta, ma pensa ottiene molto più facile, quando si utilizza date oggetti:

# 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

Grazie, @smu, che è più elegante, molto meglio di qualsiasi i miei sforzi. – gauden

Problemi correlati