【问题标题】:Time series multiple plot for different group in RR中不同组的时间序列多重图
【发布时间】:2015-02-27 06:03:35
【问题描述】:

我有一个包含多个变量(大约 50 个)的大型数据框,第一列为date,第二列为id

我的数据大致是这样的:

df <- data.frame(date = c("01-04-2001 00:00","01-04-2001 00:00","01-04-2001 00:00",
                      "01-05-2001 00:00","01-05-2001 00:00","01-05-2001 00:00",
                      "01-06-2001 00:00","01-06-2001 00:00","01-06-2001 00:00",
                      "01-07-2001 00:00","01-07-2001 00:00","01-07-2001 00:00"), 
             id = c(1,2,3,1,2,3,1,2,3,1,2,3), a = c(1,2,3,4,5,6,7,8,9,10,11,12), 
             b = c(2,2.5,3,3.2,4,4.6,5,5.6,8,8.9,10,10.6))

我希望在同一变量图中分别为所有三个 id 绘制时间序列图,ab 在不同的图中。

我试过ggplot,但没用。请帮帮我

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    你的意思是这样的吗?

    library(reshape)
    library(lattice)
    
    df2 <- melt(df, id.vars = c("date", "id"), measure.vars = c("a", "b"))
    
    xyplot(value ~ date | variable, group = id, df2, t='l')
    

    附录

    # The following is from a comment by jbaums. 
    # It will create a single plot/file for each variable of df2
    png('plots%02d.png')
    xyplot(value ~ date | variable, group = id, df2, t='l', layout=c(1, 1), 
           scales=list(alternating=FALSE, tck=1:0))
    dev.off()
    

    您还可以将relation='free' 添加到scales,以便为每个图单独计算 y 轴范围。

    【讨论】:

    • 概率应该首先as.Date,以防真正的数据集缺少日期。
    • 是的,有点这样,但我想在不同的窗口中绘制它,因为我有超过 50 个变量。还想为不同的颜色添加图例。
    • @Rajan 请澄清。
    • @jbaums 是的,应该。
    • 因为我有超过 50 个变量,它们有不同的最大值和最小值。我希望它们分开,以便我可以将每个变量图保存为单独的 png 文件
    【解决方案2】:

    编辑:阅读完 cmets 后,也许你应该尝试这样的事情:

    library(tidyr)
    df2 <- gather(df, variable, value, -date, -id)
    vars <- unique(df2$variable)
    
    library(ggplot2)
    for (i in 1:length(vars)) {
      ggplot() + 
        geom_line(data = subset(df2, variable == vars[[i]]), 
                  aes(date, value, group = id, color = factor(id))) +
        ylab(as.character(vars[[i]])) +
        ggsave(file = paste0(vars[[i]], ".png"))
    }
    

    这应该为您的数据框中的每个变量保存一个 PNG(并且将 根据您的要求将每个图的 y 标签更改为变量名称

    【讨论】:

    • @Steven 感谢您的帮助,但我有 50 多个变量。所以不可能像这样绘制。所以我希望它一个接一个地绘制,以便我可以分别保存每个变量的图形
    • 我想通过 ylab(colnames(df[i]) 将每个图的 y 标签更改为变量名,但它也不起作用。我收到此错误:“+ylab 中的错误(colnames(数据)[i]) : 对一元运算符无效的参数”。请你给我点东西
    • @Rajan,访问 vars 变量可能会更好,因为它是 for 循环的一部分。试试ylab(as.character(vars[[i]]))
    【解决方案3】:

    这里是如何在 ggplot 中执行此操作,使用 tidyr 包以正确的格式获取它:

    library(ggplot2)
    library(tidyr)
    library(dplyr)
    
    df <- data.frame(date = c("01-04-2001 00:00","01-04-2001 00:00","01-04-2001 00:00",
                          "01-05-2001 00:00","01-05-2001 00:00","01-05-2001 00:00",
                          "01-06-2001 00:00","01-06-2001 00:00","01-06-2001 00:00",
                          "01-07-2001 00:00","01-07-2001 00:00","01-07-2001 00:00"), 
                 id = c(1,2,3,1,2,3,1,2,3,1,2,3), a = c(1,2,3,4,5,6,7,8,9,10,11,12), 
                 b = c(2,2.5,3,3.2,4,4.6,5,5.6,8,8.9,10,10.6))
    

    然后使用 dplyr 的 group_by 和 do 函数,我们可以保存多个绘图。

    df %>%
      gather(variable, value, -date, -id) %>%
      mutate(id = factor(id)) %>%
      group_by(variable) %>%
      do(
        qplot(data = ., x = date, y = value, geom = "line", group = id, color = id, main = paste("variable =", .$variable)) +
              ggsave(filename = paste0(.$variable, ".png")
                 )
        ) 
    

    【讨论】:

    • @MichaelT 感谢您的帮助,但我有 50 多个变量。所以不可能像这样绘制。所以我希望它一个接一个地绘制,以便我可以分别保存每个变量的图形
    • 在这里巧妙地使用do()。 +1
    • 您应该使用paste0()paste(sep = ""),这样文件名中就没有空格。
    • 感谢您的收获。已编辑:)
    猜你喜欢
    • 2020-04-26
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多