首页 > 解决方案 > 如何绘制时间序列散点图,将缺失的 y 轴值显示为间隙?

问题描述

我正在尝试创建一个散点图,其中 x 轴上的日期/时间和 y 轴上的盐度。但是,由于设备故障,有些日期/时间点没有盐度值,但我仍然需要这些时间部分显示在我的图表上,以帮助解释我正在查看的生态模式。谁能建议如何在图表上显示这些缺失的部分?

我当前的数据代码和未显示缺失值的绘图。

编辑 我的数据有明确的缺失值,其中数据由于记录器错误而被删除,但被列为“NA”(见图)。不幸的是,我每半小时收集数千个数据点,因此很难显示所有数据。

显示“NA”值的数据屏幕截图

OY1_AllTimes <- read_csv("~/Documents/TAMUG_Thesis/Rollover_Pass_Data/Logger/RP_LoggerData_OY1_AllTimes.csv")
summary(OY1_AllTimes)

OY1_AllTimes$Date_time<-paste(OY1_AllTimes$Date, OY1_AllTimes$Time)
summary(OY1_AllTimes$Date_time)

date_time_OY1_AllTimes<-as.POSIXct(OY1_AllTimes$Date_time, format="%m/%d/%Y %H:%M")
date_time_OY1_AllTimes
date_time2_OY1_AllTimes<-as.factor(date_time_OY1_AllTimes)
date_time2_OY1_AllTimes
summary(OY1_AllTimes)

OY1_AllTimes 总结

p_OY1_AllTimes <- ggplot(data = OY1_AllTimes, aes(x=date_time2_OY1_AllTimes, y=Salinity)) + geom_point() + theme_classic()+
  scale_x_discrete("Date", breaks=c("0019-10-04 09:30:00", "0019-11-01 05:00:00", "0019-12-01 00:00:00", "0020-01-01 00:00:00", "0020-02-01 00:00:00",
                                    "0020-03-01 00:00:00","0020-04-01 00:00:00", "0020-05-01 00:00:00", "0020-06-01 00:00:00"),
                   labels=c("10/2019", "11/2019", "12/2019", "1/2020", "2/2020", "3/2020", "4/2020", "5/2020", "6/2020"))+ylab("Salinity")+ggtitle("OY1")
p_OY1_AllTimes

没有缺失值的 OY1 散点图

本质上,我希望看到上面的散点图,其中的间隙表示没有盐度数据的时期,因此日期/时间尺度是连续的。

数据子样本:

# A tibble: 50 x 5
   Site  Date    Time   Salinity Date_time       
   <chr> <chr>   <time>    <dbl> <chr>           
 1 OY1   10/4/19 09:30    NA     10/4/19 09:30:00
 2 OY1   10/4/19 10:00    NA     10/4/19 10:00:00
 3 OY1   10/4/19 10:30     0.891 10/4/19 10:30:00
 4 OY1   10/4/19 11:00     0.961 10/4/19 11:00:00
 5 OY1   10/4/19 11:30     1.02  10/4/19 11:30:00
 6 OY1   10/4/19 12:00     1.10  10/4/19 12:00:00
 7 OY1   10/4/19 12:30     1.19  10/4/19 12:30:00
 8 OY1   10/4/19 13:00     1.27  10/4/19 13:00:00
 9 OY1   10/4/19 13:30     1.33  10/4/19 13:30:00
10 OY1   10/4/19 14:00     1.42  10/4/19 14:00:00
# … with 40 more rows```

标签: rggplot2scatter-plotmissing-data

解决方案


很难说出你的数据到底是什么样子,我假设你有一个隐含的缺失数据问题。

这意味着,您有一个缺少观察的 data.frame/time 序列。但问题是,这些缺失值没有明确给出为 NA。相反,这些只是被遗漏了。

具有 NA 的时间序列如下所示:

1.1.2021 14:00
1.1.2021 15:00
1.1.2021 16:00
1.1.2021 17:00
1.1.2021 NA
1.1.2021 19:00

我猜你的问题是这样的:

1.1.2021 14:00
1.1.2021 15:00
1.1.2021 16:00
1.1.2021 17:00
1.1.2021 19:00

所以不同的是,18:00 时间步长没有 NA 值。但是,你当然知道有一个缺失值(这就是为什么它被称为隐式缺失值)。

假设您有一个规则间隔的时间序列(意味着以规则间隔测量的值,例如 1h),您可以使用tsibble包将隐式缺失值转换为正常缺失值,其中 NA 是序列。

这是一个简单的例子(因为我没有你的数据):

library("tsibble")

# Read in your data as tsibble
data_example <- tsibble(
  year = c(2016, 2017, 2018, 2019, 2021, 2022),
  measure = sample(1:10, size = 6),
  index = year
)

# Take a look at the data
data_example

# Use the fill_gaps function of tsibble
data_na <- fill_gaps(data_example, .full = TRUE)

# You can see now, the implicit missing year 2020 is now added as NA  
data_na

当然,您也可以对各种不同的规则间隔时间序列数据(15 秒、分钟、小时、月……)执行此操作。您只需要在创建 tsibble 对象时定义时间步。

现在绘图很容易:

library("ggplot2")
ggplot(data = data_na) + geom_point( aes(year, measure))

这会给你这个情节: 在此处输入图像描述

如您所见,如您所愿,该系列已绘制,但情节中没有 2020 年。如果你想把更多的注意力放在缺失的数据上,你也可以使用imputeTS包。

library("imputeTS")
ggplot_na_distribution(data_na)

然后看起来像这样: 在此处输入图像描述

这只是一个小的示例时间序列,对于更大的时间序列,这看起来像这个图: 在此处输入图像描述


推荐阅读