使用 R 从绘图中的主要数据中区分缺失值

Differentiate missing values from main data in a plot using R

我创建了一个虚拟时间序列 xts 对象,其中缺少日期 2-09-2015 的数据:

library(xts)
library(ggplot2)
library(scales)

set.seed(123)
seq <- seq(as.POSIXct("2015-09-01"),as.POSIXct("2015-09-02"), by = "1 hour")
ob1 <- xts(rnorm(length(seq),150,5),seq)
seq2 <- seq(as.POSIXct("2015-09-03"),as.POSIXct("2015-09-05"), by = "1 hour")
ob2 <- xts(rnorm(length(seq2),170,5),seq2)
final_ob <- rbind(ob1,ob2)
plot(final_ob)
# with ggplot
df <- data.frame(time = index(final_ob), val = coredata(final_ob) )
ggplot(df, aes(time, val)) + geom_line()+ scale_x_datetime(labels = date_format("%Y-%m-%d"))

绘制数据后如下所示:

红色矩形部分表示数据丢失的日期。如何在主图中显示这一天缺少数据?

我想我应该用不同的颜色来显示这个缺失的数据。但是,我不知道应该如何处理数据以反映主图中丢失数据的行为。

感谢您提供的可重现示例。 我认为您最好在 "missing" 部分中省略该行。如果您有一条直线(即使颜色不同),则表明数据是在该间隔内收集的,恰好落在该直线上。如果您省略该间隔中的行,那么很明显那里没有数据。

问题是您希望每小时数据通过线连接,然后 "missing data section" 中没有线 - 因此您需要一些方法来检测丢失的数据部分。

你没有在你的问题中给出一个标准,所以根据你的例子,我会说图中的每一行都应该由每小时间隔的数据组成;如果休息时间超过一个小时,则应该换行。您必须根据您的具体问题调整此标准。我们所做的只是将您的数据帧拆分成由同一行绘制的位。

所以首先创建一个变量,说明每个数据在"group"(即行)中:

df$grp <- factor(c(0, cumsum(diff(df$time) > 1)))

然后你可以使用 group= 美学,geom_line 用来分割线条:

ggplot(df, aes(time, val)) + geom_line(aes(group=grp)) +  # <-- only change
    scale_x_datetime(labels = date_format("%Y-%m-%d"))