Составление годового планировщика в R

Я пытался распространить свой собственный ответ о рисовании диаграммы Гантана более общий кейс. Я проиллюстрирую здесь частичный результат:

Year planner in R

На этой диаграмме нанесено несколько поездок, где красные точки обозначают отправления, а зеленые точки — возвращение. Теперь вот мой вызов:

  1. Я хотел бы отметить серой точкой все дни между отъездом и возвращением, а все остальные оставить нетронутыми.
  2. Я хотел бы, чтобы точки правильно переносились на разные длины месяцев (например, отъезд 28 июня будет обозначать дни до 30 июня, а затем переносить на 1 июля).
  3. Скрипт не должен давать сбоев в случае однодневной поездки (т.е.поездка в начале сентября, когда отправление и возвращение происходят в один и тот же день, а зеленая точка меньшего размера нанесена на красный маркер большего размера).

Создать этот график с помощью приведенного ниже кода несложно, и было бы легко соединить точки линией от красного к зеленому, где оба события происходят в один и тот же месяц. Может ли кто-нибудь помочь в случае обертывания достаточно общим образом, чтобы учитывать также високосные и невисокосные годы и т. Д.?

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)

6
задан Community 23 May 2017 в 12:19
поделиться