【问题标题】:Plotting a year planner in R在 R 中绘制年度计划
【发布时间】:2012-05-10 15:37:19
【问题描述】:

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

此图表上绘制了许多行程,红点代表出发,绿点代表返回。现在这是我的挑战:

  1. 我想用灰色点标记离开和返回之间的所有日子,而其他所有日子都保持不变。
  2. 我希望这些点能正确地围绕不同的月份长度(例如,6 月 28 日出发将标记到 6 月 30 日,然后围绕到 7 月 1 日)。
  3. 脚本不应在一日游的情况下失败(例如,9 月初的旅行,出发和返回发生在同一天,较小的绿点绘制在较大的红色标记上)。

用下面的代码生成这个图表很简单,很容易用一条从红到绿的线连接点,这两个点都发生在同一个月。任何人都可以以足以承担闰年和非闰年等的一般方式来帮助解决环绕的情况吗?

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 ggplot2


    【解决方案1】:

    可能不是完美的解决方案,但是当您使用 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)
    

    【讨论】:

    • 谢谢@smu,这是最优雅的,比我的任何努力都要好。
    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 2019-07-28
    • 2020-10-16
    • 2019-06-19
    • 1970-01-01
    • 2015-05-04
    • 2021-07-23
    • 2018-10-19
    相关资源
    最近更新 更多