R ggplot2几何图元叠加

R ggplot2几何图元叠加,r,ggplot2,R,Ggplot2,我想在时间尺度上叠加一个图。以下是我的数据: Flight_No Dest Date Time STD.60 STD.45 Date2 start end 1 ab0729 KP 14-Oct-13 00:05 1 0 2013-10-14 2013-10-14 00:05:00 2013-10-14 00:20:00 2 ab8063 KI 14-Oct-13 00:20 0 3 20

我想在时间尺度上叠加一个图。以下是我的数据:

 Flight_No Dest      Date  Time STD.60 STD.45      Date2          start       end
1    ab0729  KP 14-Oct-13 00:05      1      0 2013-10-14 2013-10-14 00:05:00 2013-10-14 00:20:00
2    ab8063  KI 14-Oct-13 00:20      0      3 2013-10-14 2013-10-14 00:20:00 2013-10-14 00:35:00
3    ab0337  ST 14-Oct-13 00:30      1      0 2013-10-14 2013-10-14 00:30:00 2013-10-14 00:45:00
下面是我绘制图形的代码:

data$Total<-data$STD.60+data$STD.45    
ggplot(data,aes(x=start,y=Total,xmin=start,xmax=end,ymin=0,ymax=Total,alpha=0,fill=factor(Dest)))+geom_rect()

data$Total一旦对日期进行排序,就很容易计算重叠范围。
对于每个间隔,我检查是否有重叠(开始>结束),如果有,我将下一个总数与下一个总数相加到当前总数

## choose just relevant columns
d <- dat[,c('start','end','Dest','Total')]
# Make sure the data is sorted
d <- d[ order(d$start), ]
h <- d
## here all the main stuff
for (i in head(seq_len(nrow(d)),-1)){
  if(d[i+1,'start'] < d[i,'end']){
    xx <- d[i,]
    xx$start <- d[i+1,'start'] 
    xx$Total <- d[i,'Total'] +d[i+1,'Total']
    h <- rbind(h,xx)   
  }
}

library(ggplot2)
ggplot(h,aes(x=start,y=Total,xmin=start,xmax=end,ymin=0,ymax=Total,
             ,fill=factor(Dest),alpha=0))+
  geom_rect()

这里有一个解决方案,它依赖于:(1)将时间轴拆分为5分钟宽的存储单元,(2)重建长格式的数据,以及(3)利用
geom\u bar(position=“stack”)
的堆叠功能

注:

  • 您可以通过更改
    seq(…,by=
    参数来更改料仓宽度。请参阅
    ?seq.POSIXt
  • 您可能希望将
    开始
    结束
    时间四舍五入到最接近的x分钟,以简化装箱过程
  • geom_条(…,宽度=300)
    工作,因为5分钟内有300秒。根据需要进行调整
  • x轴上的勾号位于条的中心,但它们实际上应用于条的左边缘。使用
    scale\u x\u datetime(breaks=
    进行调整,如@agstudy所示

  • 我不认为有“自动”这样做的方式。你可能注定要自己编写代码。我希望有人能证明我错了。@RomanLuštrik的确……嗨,在00:20和00:30之间-值应该是3。在00:30和00:35之间,值应该是4。此外,图表没有显示00:30和00之间的ST重叠:35@Chandra你想保持重叠吗?因为这里我删除了它。谢谢你或者帮助。我想继续重复有趣的解决方案,我在想什么(附加)这带来的信息。如果箱子宽度不相同,条形图之间的面积就不可直接比较。此时,这不再是条形图。我想知道JS的人是否有这样的东西随手可得?我发现他们的一些可视化在统计上不正确的方式很有创意。:)@钱德拉:我想我现在明白你的意思了。埃文:我同意罗曼的观点,这不容易解释结果。@bdemarest--谢谢你提供了很好的解决方案
    library(scales)
    last_plot()
    scale_x_datetime(breaks=unique(c(h$start,h$end)),
                   labels = date_format("%H:%M"))
    
    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)