【问题标题】:Is time-series filtering available within ggplot?ggplot 中是否提供时间序列过滤?
【发布时间】:2020-07-20 21:07:53
【问题描述】:

我在 R 中有一个具有多个时间序列的数据框。数据框由 3 列数据组成:test、timeHr 和 range。

测试列指定所执行测试的实际名称,范围给出特定于特定小时的数值(用 timeHr 表示)。

我想做的是,如果特定时间序列在任何时间点 timeHr 超过上限和/或下限,那么它将从最终的 ggplot 中省略。

这是一些示例代码,仅显示 2 个时间序列:

library(ggplot2)
test <- c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B")
timeHr <- 1:5
range <- c(0.1, 0.3, 0.4, 0.5, 1, 0.2, 0.8, 0.9, 1.1, 0.5)
mdata <- data.frame(test, timeHr, range)
mdata
str(mdata)
g <- ggplot(mdata, aes(x = timeHr, y = range, color = test))
g + geom_line() + ylim(0, 1.5)

这显示了 2 个时间序列 A 和 B。

如果我希望只包含范围

我尝试了以下方法:

g <- ggplot(mdata[mdata$range <= 1, ], aes(x = timeHr, y = range, color = test))
g + geom_line() + ylim(0, 1.5)

但它所做的只是删除了 (timeHr = 4, range = 1.1) 处的单个 B 时间点。 B 测试时间序列仍然显示,但以一种扭曲的方式显示。

ggplot 能否处理时间序列的过滤,以便如果我只想显示在整个 timeHr 宇宙中保持在特定范围内的那些时间序列,则测试 B 将从图中删除? p>

谢谢!

【问题讨论】:

  • mdata %>% dplyr::filter(range % ggplot(aes(x = timeHr, y = range, color = test)) + geom_line() + ylim(0, 1.5)
  • 您好 Dr Flow,您建议的代码似乎不起作用。我仍然看到一个扭曲的 B 时间序列,而不仅仅是 A 本身。我假设我只需要加载 dplyr 和 ggplot2 包?
  • 我不想在代码中指定 test=="A",因为我会有很多时间序列,我希望代码能够检查哪些时间序列的繁重工作实际满足范围值条件。
  • 不确定你的意思,这可能有效:mdata[which(mdata$range

标签: r ggplot2 filter time-series


【解决方案1】:

如果您想进行内联过滤,可以使用dplyr。这使用group_by 将每个测试视为一个组,然后使用filter 使得rangeall

library(dplyr)
library(ggplot2)
    mdata %>% 
      group_by(test) %>% 
      filter(all(range <= 1)) %>% 
      ggplot(aes(x = timeHr, y = range, color = test)) +
      geom_line() + ylim(0, 1.5)

【讨论】:

  • Greg,这正是我正在寻找的功能。我希望它可以直接在 ggplot2 中处理,但是使用 dplyr 不会太难,现在你已经告诉我如何了。非常感谢!
  • 乐于助人。 ggplotdplyr 密切相关,ggplot 功能通常由 dplyr 解锁。它们都是由同一个人(哈德利·威克姆)制作的,所以这绝非偶然。
【解决方案2】:

如果我正确理解你的问题,那么我会建议你制作另一个数据框,它实际上是mdata 的子集,条件是范围为

m2data <- subset(mdata, range<=1)
str(m2data)
g <- ggplot(m2data, aes(x = timeHr, y = range, color = test))
g + geom_line() + ylim(0, 1.5)

【讨论】:

  • 嗨 Sayantan4796,将 mdata 子集化为 m2data,只从测试 B 中删除一个时间点。如果测试 B 超出范围值,我希望整个测试 B 被删除。
  • 如果m2data &lt;- subset(mdata, range&lt;=1)不起作用,请尝试m2data &lt;- subset(mdata, c(range&lt;1 &amp; range =1))
  • 这似乎也不起作用。我仍然得到一个扭曲的 B 测试时间序列,而不是完全省略。
  • 这意味着你不想在 B 越过 1.0 标记后继续绘制它
  • 不,如果 B 曾经 > 1,我根本不希望将其全部绘制出来
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2010-12-27
  • 1970-01-01
相关资源
最近更新 更多