在R中绘制一年计划员

时间:2012-05-10 15:37:19

标签: r ggplot2

我一直试图将my own answer on drawing Gantt Charts扩展到更一般的情况。我在这里说明了部分结果:

Year planner in R

在此图表上绘制了多个行程,红点表示离开,绿点表示返回。现在,这是我的挑战:

  1. 我想用灰点标记出发和返回之间的所有日子,并保持所有其他人不受影响。
  2. 我希望这些要点可以正确地包裹不同的月份长度(例如,6月28日的出发将标志着截至6月30日的日子,然后再回到7月1日。)
  3. 在为期一天的行程中,脚本不应该失败(例如9月初的行程,在同一天发生出发和返回,在较大的红色标记上绘制较小的绿点)。
  4. 使用下面的代码生成此图表是微不足道的,并且很容易将点与红色到绿色的线连接起来,这两个点都发生在同一个月。任何人都可以以一般的方式帮助处理环绕的情况,也可以采取跨越和非闰年等方式吗?

    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)
    

1 个答案:

答案 0 :(得分:5)

当您使用date个对象时,可能不是完美的解决方案,但认为会更容易:

# 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