2012-05-10 16 views
6

Próbowałem przedłużyć my own answer on drawing Gantt Charts do bardziej ogólnego przypadku. I przedstawiono częściowy rezultat tutaj:Wykreślanie rocznego terminarza w R

Year planner in R

Wiele wycieczek są kreślone na tym wykresie, z czerwonymi punktami reprezentującymi wylotach i zielonych kropek zwrot. Oto moje wyzwanie:

  1. Chciałbym zaznaczyć wszystkie dni między odejściem a powrotem za pomocą szarego punktu i pozostawić wszystkie pozostałe nietknięte.
  2. Chciałbym, aby punkty poprawnie obejmowały różne długości miesięcy (np. Wyjazd 28 czerwca oznaczałby dni do 30 czerwca, a następnie zawijał do 1 lipca).
  3. Scenariusz nie powinien zawieść w przypadku jednodniowej wycieczki (np. Podróży na początku września, kiedy odlot i powrót odbywają się tego samego dnia, a mniejsza zielona kropka jest umieszczana na większym czerwonym znaczniku).

To jest trywialne, aby utworzyć ten wykres z poniższym kodem, a łatwo byłoby połączyć kropki z linią od czerwonego do zielonego, gdzie oba mają miejsce w tym samym miesiącu. Czy ktokolwiek może pomóc w przypadku zawijania w sposób na tyle ogólny, aby wziąć na siebie także lata skaczące i nieskrępowane?

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) 

Odpowiedz

5
nie

Prawdopodobnie idealne rozwiązanie, ale myśli się o wiele łatwiejsze, gdy używasz date obiekty:

# 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

Dzięki @smu, to najbardziej elegancki, dużo lepiej niż którykolwiek z moje wysiłki. – gauden