【问题标题】:Plotting multiple time series data ( long format ) into one plot?将多个时间序列数据(长格式)绘制到一个图中?
【发布时间】:2013-05-27 15:24:10
【问题描述】:

假设我有 3 个时间序列数据“a”,“b”,“c”,它们每个都有 2 个变量要在 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])

我可以一次绘制一种类型(如上),但我想将所有“a”“b”“c”...绘制到该面板中,其中不同的颜色代表不同类型的时间序列。

所以我正在寻找的是一个有两个面板(用于“V1”和“V2”)的情节,并且在每个面板中,有几行(“a”、“b”、“c”.. .) 用不同的颜色

【问题讨论】:

    标签: r plot zoo


    【解决方案1】:

    试试这个动物园经典图形、动物园格子图形和动物园 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 替代方案。它使用 data.table 包将DT 转换为长格式,然后执行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)
    

    【讨论】:

    • splitread.zoo 我可以画几列,但我绘制的面板(2*3)比我想要的多(2)。
    • 已修改为在每种情况下生产 2 个面板。
    • 感谢您提供如此详细的答案!我更喜欢动物园经典图形,因为我有一个自定义面板选项(主要处理 x 轴)。 @G.Grothendieck 的答案适用于我发布的示例数据,但在我将它们应用于我的真实数据集之前必须完成某些琐碎的工作。一件事是在我的真实数据集中还有其他列我对绘制不感兴趣,read.zoo 将它们视为与V1V2 相同。所以我必须先删除它们。另一件事是我使用id(大数字,如85716或776444)而不是type(a,b,c),这可能意味着相同的颜色。
    • 只传递DT 的前4 列,比如说,使用z &lt;- read.zoo(DT[, 1:4, with = FALSE], ...)。为确保该类型不被解释为其数值,请将其作为一个因素:Names$col &lt;- factor(Names$col)
    【解决方案2】:

    lattice 包为例,你可以这样做:

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

    您也可以使用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)
    

    【讨论】:

    • 谢谢。我不熟悉xyplotggplot,但我认为 V1 和 V2 最好有一个 y 轴,因为它们可能有不同的值范围。与layout=c(1,2) 我想我可以让它们共享共同的x 轴。但它们仍然具有相同的 y 轴范围。
    • scales = list(y = list(relation = "free")) xyplot 看起来很有希望
    • @Jersey好的,是的。对于 ggplot 你可以做类似facet_grid(cyl ~ variable, scales="free")
    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 2011-09-30
    • 2016-11-06
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多