r - 如何绘制时间序列散点图,将缺失的 y 轴值显示为间隙?
问题描述
我正在尝试创建一个散点图,其中 x 轴上的日期/时间和 y 轴上的盐度。但是,由于设备故障,有些日期/时间点没有盐度值,但我仍然需要这些时间部分显示在我的图表上,以帮助解释我正在查看的生态模式。谁能建议如何在图表上显示这些缺失的部分?
我当前的数据代码和未显示缺失值的绘图。
编辑 我的数据有明确的缺失值,其中数据由于记录器错误而被删除,但被列为“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)
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
本质上,我希望看到上面的散点图,其中的间隙表示没有盐度数据的时期,因此日期/时间尺度是连续的。
数据子样本:
# 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```
解决方案
很难说出你的数据到底是什么样子,我假设你有一个隐含的缺失数据问题。
这意味着,您有一个缺少观察的 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)
推荐阅读
- c - 调用堆栈函数序言混乱
- jmeter - Jmeter-如何捕获从请求发送到在数据库中更新的时间?
- php - 检查变量是否不同,回显然后更新变量以重新检查
- java - 构造函数在 JUnit 测试期间为类方法返回 null
- java - Java不返回超类的值,将对象作为json传输时将字段返回为null
- python - 迁移到 heroku postgres db 时出错:为列“id”指定了多个默认值
- javascript - 条纹。TypeError:document.querySelectorAll 不是函数
- google-cloud-platform - GCP Cloud Armor 是否支持 TCP 负载均衡器?我无法将 TCP 负载均衡器添加为 Cloud Armor 中的目标
- android - 如何在android应用程序中存储许多音频文件
- apache-flink - flink sql读取配置单元表抛出java.lang.ArrayIndexOutOfBoundsException:1024