【问题标题】:ggplot: Plotting timeseries data with missing valuesggplot:用缺失值绘制时间序列数据
【发布时间】:2018-11-11 21:54:48
【问题描述】:

我一直在尝试在我创建的数据框中的两列之间绘制图表。第一列存储的数据值是名为“时间”的每日时间数据(格式-YYYY-MM-DD),第二列包含降水量级,这是一个名为“data1”的数值。

此数据取自一个 Excel 文件“St Lucia3”,该文件共有 11598 个数据点,并将 1981 年至 2018 年的每日降水数据存储在两列中:

  1. YearMonthDay(格式-“YYYYMMDD”,例如“19810501”)

  2. 降雨量(毫米)

将数据导入R的代码:

StLucia <- read_excel("C:/Users/hp/Desktop/St Lucia3.xlsx")

时间数据“时间”的代码:

Time <- as.Date(as.character(StLucia$YearMonthDay), format= "%Y%m%d")

降水数据“data1”的代码:

library("imputeTS")
data1 <- na_ma(StLucia$`Rainfall (mm)`, k = 4, weighting = "exponential")

数据框“Pecip1”的代码:

Precip1 <- data.frame(Time, data1, check.rows=TRUE)

ggplot的代码是:

ggplot(data = Precip1, mapping= aes(x= Time, y= data1)) + geom_line()

使用 ggplot 在“Time”和“data1”结果之间绘制图形:

有人可以向我解释为什么在图表的右端会出现类似“异常扭结”的行为,即使“data1”列中没有这样的值。

“data1”数据与其索引的图如图所示:

这个情节的代码是:

plot(data1, type = "l")

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 没有 2015 年和 2017 年左右情节再次回升之间的数据。您正在绘制折线图,​​以便连接这些点。也许您有一些缺失的数据?
  • 你能把你的电话包括在ggplot吗?看起来您正在使用某种线图,而您想在其中使用条形图。
  • 数据好像有缺口。它有截至 2014 年某个时间的数据,然后直到 2017 年末或 2018 年初才没有数据。尝试搜索 2015 年或 2016 年的日期。我敢打赌没有。
  • @KaranChaudhary 数据仍然可以进入文件中的 1、2、3、4,但不能按日期连续排列。因此数据不会跳过索引中的行,因为文件本身中没有这些日期。因此 2015 年 12 月 1 日可能正好在 2017 年 5 月 31 日之前,如果您按日期绘制图表,您只会看到这个差距,因为在索引中没有差距。
  • @KaranChaudhary:通常最好使用geom_col 绘制降水数据

标签: r ggplot2


【解决方案1】:

这是一个可重现的示例 - 更改名称以匹配您的数据。

# create sample data
set.seed(47)
dd = data.frame(t = Sys.Date() + c(0:5, 30:32), y = runif(9))

# demonstrate problem
ggplot(dd, aes(t, y)) +
    geom_point() +
    geom_line()

正如 Tung 指出的那样,最简单的解决方案是使用更合适的 geom,例如 geom_col

ggplot(dd, aes(t, y)) +
    geom_col()

如果你真的想用线条,你应该用NA填写缺少的日期以表示降雨。 H

# calculate all days
all_days = data.frame(t = seq.Date(from = min(dd$t), to = max(dd$t), by = "day"))
# join to original data
library(dplyr)
dd_complete = left_join(all_days, dd, by = "t")

# ggplot won't connect lines across missing values
ggplot(dd_complete, aes(t, y)) +
    geom_point() +
    geom_line()

或者,您可以将缺失值替换为 0 以使线沿轴移动,但我认为不绘制线更好,这意味着没有数据/缺失数据,而不是绘制 0 意味着没有降雨.

【讨论】:

  • 在气象和水文学中,我们通常使用 geom_colgeom_bar 绘制降雨/降水数据,这也消除了错误的线
【解决方案2】:

通过使用 pad 我们可以弥补那些丢失的值并分配一个 NA 值 避免在缺失数据的区域进行绘图。

library(padr)
library(zoo)

YearMonthDay<-c(19810501,19810502,19810504,19810505)
Data<-c(1,2,3,4)

StLucia<-data.frame(YearMonthDay,Data)

 StLucia$YearMonthDay <- as.Date(as.character(StLucia$YearMonthDay), format= 
 "%Y%m%d")

> StLucia
  YearMonthDay Data
1   1981-05-01    1
2   1981-05-02    2
3   1981-05-04    3
4   1981-05-05    4

注意:您可以看到我们缺少日期,但位置 2 和 3 之间仍然没有间隙,因此绘制与索引您不会看到间隙。

所以让我们添加缺少的日期:

 StLucia<-pad(StLucia,interval="day")

> StLucia
   YearMonthDay Data
 1   1981-05-01    1
 2   1981-05-02    2
 3   1981-05-03   NA
 4   1981-05-04    3
 5   1981-05-05    4

 plot(StLucia, type = "l")

如果要填写这些 NA 值,请使用 package(zoo) 中的 na.locf()

【讨论】:

  • 谢谢@Chabo先生,但我想补充一点,因为原始降雨数据已经有一些缺失值,所以我使用了库“imputeTS”中的“na.ma”功能" 填写缺失值(如您在“data1”的代码中所见)。而且我还检查了“data1”中的数据点,没有报告为“NA”的缺失值。
  • na.ma()现有 NA 值替换为平均值,但不弥补任何应该在数据中的 NA(即缺失日期)。 @KaranChaudhary
  • 另一方面,pad() 根据您提供的时间间隔查看缺少日期的位置,如果在这种情况下跳过一天,则会分配 NA 值。您可能在原始数据中有许多 NA 值,但这并不能保证数据也包含 1981 年至 2018 年之间的所有日期。我可以保证您缺少 2015 年至 2017 年的数据,pad 会识别这一点并分配正确的日期和不适用。 @KaranChaudhary
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多