2013-05-27 102 views
0

假設我有3個時間序列數據「a」,「b」,「c」,他們每個人有7個變量需要記錄7天。將多個時間序列數據(長格式)繪製成一個繪圖?

這裏去示例代碼:

require(data.table) 
#Create data 
DT<-data.table(type=c(rep("a",7),rep("b",7),rep("c",7)), time=1:7,V1=rnorm(7*3,10,5),V2=rnorm(7*3,100,20),key="type") 
# plot.zoo 
require(zoo) 
plot(zoo(DT["a"])[,3:4]) 

enter image description here

我能繪製一種類型的時間(如上),但我想繪製所有 「A」 「B」「C 「......進入該面板,其中不同顏色表示不同類型的時間序列。

所以我在尋找的是一個有兩個面板(「V1」和「V2」)的情節,在每個面板中有幾行(「a」,「b」,「c」)。 ..)用不同顏色

回答

2

嘗試此動物園的經典圖形,動物園點陣圖形和動物園GGPLOT2顯卡:

library(zoo) 
z <- read.zoo(DT, split = 1, index = 2, FUN = identity) 
Names <- read.table(text = names(z), sep = ".", col.names = c("screen", "col")) 

plot(z, screen = Names$screen, col = Names$col) # also see note 3 below 

library(lattice) 
xyplot(z, screen = Names$screen, col = Names$col) # also see note 3 below 


library(ggplot2) # also see note 4 below 
m <- fortify(z, melt = TRUE) 
m2 <- transform(m, screen = sub("\\..*", "", Series), col = sub(".*\\.", "", Series)) 
qplot(Index, Value, data = m2, col = col, geom = "line") + facet_wrap(~ screen) 

1)如果我們只是想獨立的面板它只是是plot(z),xyplot(z)autoplot(z)

2)names(z)Names是:

> names(z) 
[1] "V1.a" "V2.a" "V1.b" "V2.b" "V1.c" "V2.c" 
> Names 
    screen col 
1  V1 a 
2  V2 a 
3  V1 b 
4  V2 b 
5  V1 c 
6  V2 c 

3)我們可能只是硬編碼它,因爲這(在這種情況下,我們就不需要Names):

plot(z, screen = 1:2, col = c(1, 1, 2, 2, 3, 3)) 

xyplot(z, screen = 1:2, col = c(1, 1, 2, 2, 3, 3)) 

4)在這裏是不涉及z的ggplot2替代方案。其轉換DT長形式data.table包,然後執行qplot

long <- DT[, list(Series = names(.SD), Value = unlist(.SD)), by = list(type, time)] 
qplot(time, Value, data = long, col = type, geom = "line") + facet_wrap(~ Series) 
+0

''read.zoo''中的'split'我可以繪製多列,但是我繪製了更多的繪製面板(2 * 3)我想(2)。 – JerseyGood

+0

在每種情況下都進行了修改以生成2個面板。 –

+0

@ G.Grothendieck優秀的回答!! + 1 – agstudy

1

使用lattice包,例如,你可以這樣做:

library(lattice) 
xyplot(V1+V2~time,groups=type,data=DT,type='l') 

enter image description here

你也可以做到這一點使用ggplot2

library(reshape2) 
dt.m <- melt(DT,measure.vars=c('V1','V2')) 

ggplot(dt.m) + 
geom_line(aes(x=time,y=value,group=type,color=type)) + 
    facet_grid(~variable) 

enter image description here

+0

感謝。我不熟悉'xyplot'或'ggplot',但我認爲V1和V2更好的是擁有一個Y軸,因爲它們可能有不同的值範圍。與'佈局= C(1,2)'我想我可以讓他們分享共同的X軸。但他們仍然有相同的y軸範圍。 – JerseyGood

+1

'scale = list(y = list(relation =「free」))'看起來很有希望xyplot – JerseyGood

+0

@JerseyGood是的。對於ggplot,你可以像'facet_grid(cyl〜variable,scales =「free」)那樣做' – agstudy