ggplot:绘制缺少值的时间序列数据

时间:2018-06-01 17:59:57

标签: r ggplot2

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

此数据来自excel文件“St Lucia3”,该文件具有 11598 总数据点,并将1981年至2018年的每日降水数据存储在两列中:

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

2)降雨量(mm)

将数据导入R:

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

时间数据代码“时间”:

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

降水数据“data1”的代码:

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绘制“时间”和“数据1”之间的图形结果为:Link to the Rplot between "data1" and "Time"

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

“data1”数据与其索引的关系如下所示:Link for Rplot for "data1" against its index

该图的代码是:

plot(data1, type = "l")

任何帮助都将受到高度赞赏。谢谢!

2 个答案:

答案 0 :(得分: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")

enter image description here

如果要填写这些NA值,请使用包(动物园)中的na.locf()

答案 1 :(得分: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()

enter image description here

董先生指出,最简单的解决方案是使用更合适的地理位置,例如geom_col

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

enter image description here

如果您真的想使用线路,则应使用NA填写缺失日期以了解降雨量。 ħ

# 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()

enter image description here

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