【问题标题】:How to make "interactive" time series plots for exploratory data analysis如何为探索性数据分析制作“交互式”时间序列图
【发布时间】:2020-05-20 10:39:58
【问题描述】:

我有一个类似于下面创建的data 的时间序列数据框。对每个人进行 5 个变量的测量。个人拥有唯一的ID 号码。请注意,在此数据集中,每个人的长度相同(每个人有 1000 个观察值),但在我的真实数据集中,每个人的长度不同(每个人的观察次数不同)。对于每个人,我想将所有 5 个变量相互叠加(即全部在 y 轴上)并将它们与time(x 轴)进行对比。我想将这些图中的每一个打印到某种类型的外部文档(pdf,或为此应用程序推荐的任何内容),每页一个图,这意味着每个人都有自己的页面和一个图。我希望这些时间序列图是“交互式的”,因为我可以将鼠标移到一个点上,它会告诉我 time 各个数据点的位置。我这样做的目标是探索 5 个变量之间的峰、谷和其他区域之间的关联。我不确定ggplot2 是否仍然是最好的应用程序,但我仍然希望情节具有美学吸引力,以便更容易看到数据中的模式。另外,将这些图粘贴到 pdf 是最明智的路线吗?还是我最好使用 R 笔记本或其他应用程序?

ID <- rep(c("A","B","C"), each=1000)
time <- rep(c(1:1000), times = 3)
one <- rnorm(1000)
two <- rnorm(1000)  
three <- rnorm(1000)
four <- rnorm(1000)
five<-rnorm(1000)
data<- data.frame(cbind(ID,time,one,two,three,four,five))

【问题讨论】:

    标签: r loops ggplot2 time-series iteration


    【解决方案1】:

    尝试使用plotly 包。而且由于您希望它具有交互性,因此您需要导出为 html 而不是 pdf 之类的内容。

    生成单面图(注意我在您的样本数据中添加了stringAsFactors = FALSE):

    library(tidyverse)
    library(plotly)
    
    ID <- rep(c("A","B","C"), each=1000)
    time <- rep(c(1:1000), times = 3)
    one <- rnorm(1000)
    two <- rnorm(1000)  
    three <- rnorm(1000)
    four <- rnorm(1000)
    five<-rnorm(1000)
    data<- data.frame(cbind(ID,time,one,two,three,four,five),
                      stringsAsFactors = FALSE)
    
    data_long <- data %>% 
      gather(variable,
             value,
             one:five) %>%
      mutate(time = as.numeric(time),
             value = as.numeric(value))
    
    plot <- data_long %>% 
      ggplot(aes(x = time, 
                 y = value, 
                 color = variable)) +
      geom_point() +
      facet_wrap(~ID)
    
    interactive_plot <- ggplotly(plot)
    
    htmlwidgets::saveWidget(interactive_plot, "example.html")
    

    如果您想以编程方式为每个ID 生成和导出交互式绘图:

    walk(unique(data_long$ID),
        ~ htmlwidgets::saveWidget(ggplotly(data_long %>% 
                                    filter(ID == .x) %>% 
                                    ggplot(aes(x = time, 
                                               y = value, 
                                               color = variable)) +
                                    geom_point() +
                                    labs(title = paste(.x))),
                                  paste("plot_for_ID_", .x, ".html", sep = "")))
    

    编辑:我将 map() 更改为 walk(),以便在没有控制台输出的情况下生成绘图(以前只是一个包含 3 个空元素的列表)。

    【讨论】:

    • 当我尝试您的第一个示例时,我只得到一个图,而不是 3 个图(每个 ID 一个)。即使逐字使用您的代码,我似乎也无法弄清楚原因。有什么想法吗?
    • 我的回答中出现复制粘贴错误。我在第一个情节中添加了facet_wrap(~ID)。让我知道这是否有效。
    • 谢谢你的工作,除了它需要geom_point()+而不是geom_point()%&gt;%
    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2022-01-08
    • 2012-02-20
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多