2012-04-25 80 views
0

我有以下數據:時間序列可視化的開始,結束,持續時間中的R

> Data 
      Date Start  End 
1 2011-11-15 12:01:27 12:30:15 
2 2011-11-16 12:01:25 12:32:15 
3 2011-11-17 12:01:02 12:39:12 
4 2011-11-19 12:01:12 12:30:18 

到我也在我的頭附加一個持續時間列

Data[,4] <- as.numeric(difftime(Data$End,Data$Start)) 
names(Data)[4] <- "Duration" 

我有可視化開始,結束,看起來有點像股票candlestickOHLC圖表,其中x值是日期,y是結束 - 開始。

結束位於頂部,矩形下降到開始 - 矩形的高度隨持續時間隨時間變化。也就是說,每個日期具有不同的矩形高度,由開始和結束之間的差異確定。

x軸在這裏從2011-11-15到2011-11-19。 y軸從12:00:00到12:40:00。

做任何ggplot嚮導看到一個簡單的方法來做到這一點?既然開始和結束都隨着時間的推移而改變,我是否必須使用geom_ribbon或geom_polygon而不是geom_bar或geom_area?

如果當持續時間的值大於2個標準差時,條的顏色可以變爲紅色,那將會非常酷!

回答

4

我用一個相似的結構尼科:

date = c("2011-11-15", "2011-11-16", "2011-11-17", "2011-11-19") 
start = c("12:01:27", "12:01:25", "12:01:02", "12:01:12") 
end = c("12:30:15", "12:32:15", "12:39:12", "12:30:18") 

接下來,我們把它放在一個數據框中,該數據框包含矩形的拐角:

##I've made the rectangles 2 hours wide 
df = data.frame(date = as.POSIXct(date), 
     ystart = as.POSIXct(start, format="%H:%M:%S"), 
     yend = as.POSIXct(end, format="%H:%M:%S"), 
     xstart=as.POSIXct(paste(date, "12:00:00"), format="%Y-%m-%d %H:%M:%S"), 
     xend = as.POSIXct(paste(date, "14:00:00"), format="%Y-%m-%d %H:%M:%S")) 

然後我們只需使用geom_rect

ggplot() + geom_rect(data=df, aes(ymin=ystart, ymax=yend, 
          xmin=xend, xmax=xstart)) 

如果你想使一些紅色基於一個條件,只要你的數據幀上創建一個額外的列:

##Your condition is something to do with the sd 
df$isRed = c(TRUE, FALSE) 

然後添加兩個ggplot圖層:

ggplot() + geom_rect(data=subset(df, !isRed), aes(ymin=ystart, ymax=yend, 
          xmin=xend, xmax=xstart)) + 
      geom_rect(data=subset(df, isRed), aes(ymin=ystart, ymax=yend, 
          xmin=xend, xmax=xstart), colour="red") 

例圖

enter image description here

+0

這是否值得商榷是值得商榷的,但是您可以將'colour'參數指定爲審美並手動調整比例,如下所示:'ggplot(df,aes(date,ymin = y.from,ymax = y.to ,color = isRed))+ geom_linerange()+ scale_colour_manual(values = c(「TRUE」=「red」,「FALSE」=「black」),guide =「none」)'。使用兩種顏色,添加單獨的幾何體可以說非常簡單,但可能不如可縮放。 – Chase 2012-04-25 15:00:03

+0

抱歉令人困惑。尼科得到了我在尋找美學的東西。這很接近,我喜歡ggplot,但是geom_linerange可以產生更多的酒吧而不僅僅是線條? – Mittenchops 2012-04-25 17:38:57

3

我不使用ggplot,但我可以給你一個基礎R解決方案

# Generate the data 
date <- c("2011-11-15", "2011-11-16", "2011-11-17", "2011-11-19") 
start <- c("12:01:27", "12:01:25", "12:01:02", "12:01:12") 
end <- c("12:30:15", "12:32:15", "12:39:12", "12:30:18") 

# Put everything in a data frame and convert to POSIXct objects 
# The times will be all converted to today's date 
# but this will not influence the plot 
df <- data.frame(date = as.POSIXct(date), 
       start = as.POSIXct(start, format="%H:%M:%S"), 
       end = as.POSIXct(end, format="%H:%M:%S")) 

# Get the working range for the axes in order to make them nicer (see below) 
x.from <- as.POSIXct(min(date)) 
x.to <- as.POSIXct(max(date)) 
y.from <- as.POSIXct(min(start), format="%H:%M:%S") 
y.to <- as.POSIXct(max(end), format="%H:%M:%S") 

# Create an empty plot, as rect will not create a new one 
# We put no axes on the plot 
plot(0, "n", xaxt="n", yaxt="n", ylab="", xlab="Day", 
    ylim=c(from, to), xlim=range(df$date)) 

# Now draw the rectangles (I made them 2 hours-wide) 
rect(df$date-3600, df$start, df$date+3600, df$end, col="black") 

days <- seq(x.from, x.to, 24*3600) 
times <- seq(y.from, y.to, 300) # 5 min (=300 s) axis ticks 
# Finally add the axes 
axis(1, at=days, labels=strftime(days, "%d/%m")) 
axis(2, at=times, labels=strftime(times, "%H:%M"), las=1) 

結果:(!謝謝)

candlestick-like plot

+0

對不起,沒有現在的時間添加色彩位,將嘗試添加今晚(除非一些其他更好的解決方案出現) – nico 2012-04-25 07:13:01

+0

這是八九不離十。我正在尋找更寬的酒吧(幾乎接觸),但是一旦我添加了我擁有的2年左右的數據點,這肯定會是一個有趣的圖表。感謝您的指導! – Mittenchops 2012-04-25 17:31:09

+0

@Mittenchops:只需在'rect'調用中將3600更改爲具有更寬條的東西;) – nico 2012-04-25 17:46:09

相關問題