2012-05-10 6 views
6

にプロットするより一般的なケースにはmy own answer on drawing Gantt Chartsを拡張しようとしています。私はここで部分的な結果を示しています年プランナーをR

Year planner in R

トリップ数が逸脱を表す赤のポイント、そして緑のドットリターンで、このチャート上にプロットされています。

  • 私は、出発点と戻り点の間のすべての日に灰色の点を付けて、他のすべてのものをそのままにしたいと考えています。
  • ポイントが異なる月の長さを正しく囲むようにしたいと思います(たとえば、6月28日の出発は6月30日をマークし、7月1日に折り返します)。
  • 出発日と帰りが同じ日に発生し、小さい緑色の点が大きな赤いマーカーにプロットされているような、1日の旅行の場合にはスクリプトは失敗しません。
  • 以下のコードでこのグラフを作成するのは簡単で、同じ月に両方が発生する赤から緑の線でドットを結合するのは簡単です。誰も跳躍や非閏年などを取るのに十分な方法でラップアラウンドのケースを手伝ってもらえますか?

    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) 
    

    答えて

    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

    +1

    おかげで、@smu、それは、任意のよりもはるかに良い、最もエレガントなのです私の努力。 – gauden

    関連する問題