如何绘制折线图(ggplot2)的每个单独段的斜率?

时间:2019-06-19 17:32:47

标签: r ggplot2

我正在绘制一个中等大小的数据集(土壤湿度与时间的关系),并试图绘制一阶导数。但是,该图似乎没有一条最佳拟合的简单曲线。 graph

我尝试使用ggplot的line()将其绘制为折线图,现在希望将每个线段的斜率绘制为y值,x值为两次的中点。我尝试了lm()以及diff(x)/ diff(y)都没有成功,也没有找到任何在线资源支持此问题。使用lm()函数可在整个图形上形成一条线,而我想要每个线图的斜率。我的数据框如下所示:

dput(head(ms_data))
structure(list(V1 = structure(c(1497554040, 1497554160, 1497554280, 
1497554400, 1497554520, 1497554640), class = c("POSIXct", "POSIXt"
), tzone = ""), V2 = c(0.444, 0.445, 0.445, 0.445, 0.445, 0.445
)), row.names = c(NA, 6L), class = "data.frame")

我的代码如下:

plot <- ggplot(data = ms_data, mapping = aes(x = V1, y = V2))
line <- geom_line()
dot <- geom_point(size = .01)
plot <- plot + line + dot
plot

此代码全部运行,但是我不知道如何绘制每个线段的斜率与时间值的中点的关系。 预先感谢您的帮助!

编辑:我想要的基本示例是: example

其中绿色是原始折线图,蓝色是每个线段的斜率。

1 个答案:

答案 0 :(得分:0)

此解决方案基于将蓝点放置在绿线段的中间(在x轴上)的示例。创建几个新变量并在另一个geom_point调用中使用它们将为您提供结果。对于您的示例,斜率是.001和0,所以这是一个奇数图。

df <- ms_data %>% 
  arrange(V1) %>% 
  mutate(slope = V2 - lag(V2),
         V3 = V1 - (V1 - lag(V1))/2)

plot <- ggplot(data = df, mapping = aes(x = V1, y = V2))
line <- geom_line(color = "darkgreen")
dot <- geom_point(size = .01, color = "darkgreen")
plot <- plot + line + dot + geom_point(aes(x = V3, y = slope), color = "blue")
plot

enter image description here