Вот это решение, которое зависит от: (1) Разделение оси времени в 5 минут широких бункеров, (2) Восстановление данных в долгосрочной форме, и (3) Пользуясь возможностей укладки geom_bar(position="stack")
.
dat = structure(list(Dest = c("KP", "KI", "ST"), Total = c(1L, 3L, 1L),
start = structure(c(1381730700, 1381731600, 1381732200),
class = c("POSIXct", "POSIXt"), tzone = ""),
end = structure(c(1381731600, 1381732500, 1381733100),
class = c("POSIXct", "POSIXt"), tzone = "")),
.Names = c("Dest", "Total", "start", "end"),
class = "data.frame", row.names = c(NA, -3L))
# Use loop to split each row of data into bins.
Time = as.POSIXct(vector())
Dest = vector("character", length=0)
Total = vector("integer", length=0)
for (i in seq(nrow(dat))) {
times = seq(from=dat[i, "start"], to=dat[i, "end"], by="5 min")
times = head(times, -1) # Remove last element.
Time = c(Time, times)
Dest = c(Dest, rep(dat[i, "Dest"], length(times)))
Total= c(Total, rep(dat[i, "Total"], length(times)))
}
dat2 = data.frame(Time, Total, Dest)
library(ggplot2)
p = ggplot(dat2, aes(x=Time, y=Total, fill=Dest)) +
geom_bar(stat="identity", position="stack", width=300, color="grey30")
ggsave("plot.png", plot=p, width=10, height=4.5, dpi=120)
Примечания:
- Вы можете изменить ширину бен изменив
seq(..., by=
аргумент. См. ?seq.POSIXt
.
- Возможно, вы захотите округлить
start
и end
раз до ближайшей минуты, чтобы облегчить процесс биннинга.
geom_bar(..., width=300)
работает, потому что есть 300 секунд за 5 минут. При необходимости отрегулируйте.
- Маркировка по оси X находится в центре баров, но они действительно применяют левый край панели. Отрегулируйте с помощью
scale_x_datetime(breaks=
, как показано на рисунке @agstudy.
Я не думаю, что есть «автоматический» способ сделать это. Вероятно, вы обречены самим закодировать это. Надеюсь, кто-то докажет, что я неправ. –
@ RomanLuštrik действительно ... – agstudy