【问题标题】:ggplot: plot time series with repeating time valuesggplot:绘制具有重复时间值的时间序列
【发布时间】:2019-12-02 10:11:51
【问题描述】:

我有几个小时内的一些数据,如下所示:

df <- data.frame('hour' = rep(0:23, 2),
                 'mean' = rnorm(48),
                 'sd' = rnorm(48))

我希望在整个期间绘制geom_smooth()

df %>%
  ggplot(aes(y = mean, x = hour)) +
  geom_smooth(aes(y = sd))

但是,默认情况下,我的 hour 参数被考虑在内,因此每小时只出现一次,如果添加 geom_point() 可以看出,但我希望所有 48 个(实际上更多)值出现在我的x 轴。 我意识到肯定有一个参数我丢失但找不到。

【问题讨论】:

  • 如果您的数据已经在hour 级别汇总,您将无法执行此操作。你应该让你的数据处于 ggplot 的融化状态。
  • @csgroen 但它没有按小时级别汇总,相反。每小时故意在数据中出现多次。你的意思是我应该延长时间,例如包括一个日期?
  • 哦,抱歉,您的示例是按小时级别汇总的,所以我假设。我对您的预期输出感到有些困惑。你想在你的情节上每小时得到一个点吗?如果是,那么您可以做一个 geom_point(或 geom_jitter 用于许多重叠点)。
  • geom_smooth 的目的是汇总数据,所以我不确定您是否正在为您希望生成的内容找到正确的 geom_*。你能描述一下你希望的情节吗?
  • 我不确定我是否理解您的问题。如果我添加 geom_point() 我每小时看到两个点。

标签: r ggplot2


【解决方案1】:

您需要将您使用的小时定义为 date_time 对象,其中下半部分的小时是第二天

您可以使用以下代码:

library(dplyr)
library(ggplot2)

set.seed(9876) # for reproducibility
df <- data.frame('hour' = seq(c(ISOdate(2019,12,1)), by = "hour", length.out = 48),
                 'mean' = rnorm(48),
                 'sd' = rnorm(48))

df %>%
  ggplot(aes(y = mean, x = hour)) +
  geom_smooth(aes(y = sd))

请告诉我这是否是您想要的。

【讨论】:

  • 很遗憾,我的数据已经设置,不是我自己制作的,所以我无法更改时间,我不知道日期是什么。但这确实给了我一个想法,即只给出可以正常工作的行索引,然后使用geom_ribbon 单独添加功能区。谢谢。
【解决方案2】:

如果我理解正确,您希望 geom_smooth 行代表数据框中的平均列,而错误功能区代表 sd 列。

我相信这应该会提供您正在寻找的输出:

library(dplyr)
library(ggplot2)

df %>%
ggplot(aes(y = mean, x = hour)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "loess", se = FALSE) +
  stat_summary(aes(y = sd), fun.data = mean_se, geom="ribbon", alpha=0.25)

【讨论】:

  • 我已经在 cmets 中解释过,我的主要问题是 smooth 按 x 轴值汇总数据,而我不希望汇总数据,我希望 x 值重复因为这是一个时间序列。您的解决方案很好,但可以解决不同的问题。 :)
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 2018-11-11
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多