【问题标题】:plotting daily rainfall data using geom_step使用 geom_step 绘制每日降雨数据
【发布时间】:2017-02-13 17:20:49
【问题描述】:

我有一些连续收集的降雨数据,我从中计算了每日总数。这是一些玩具数据:

Date <- c(seq(as.Date("2016-07-01"), by = "1 day", length.out = 10))
rain_mm <- c(3,6,8,12,0,0,34,23,5,1)
rain_data <- data.frame(Date, rain_mm)

我可以将这些数据绘制如下:

ggplot(rain_data, aes(Date, rain_mm)) +
  geom_bar(stat = "identity") +
  scale_x_date(date_labels = "%d")

这给出了以下内容:

这看起来不错。某一天的降雨量是显而易见的。但是,也可以理解为在一天的中午到第二天的中午之间,下了一定量的雨,这是错误的。如果该图与同一时期内相关连续变量的其他图相结合,这尤其是一个问题。

为了解决这个问题,我可以使用geom_step,如下所示:

library(ggplot)
ggplot(rain_data, aes(Date, rain_mm)) +
  geom_step() +
  scale_x_date(date_labels = "%d")

这给出了:

这是显示数据的更好方式,现在 scale_x_date 似乎是一个连续轴。但是,最好将台阶下方的区域填满,但似乎找不到直接的方法。

Q1:如何在 geom_step 下方填充?有可能吗?

Date 转换为POSIXct 也可能很有用,以便在SO question here 中讨论的多图图形中促进相同的x 轴。 我可以这样做:

library(dplyr)
rain_data_POSIX <- rain_data %>% mutate(Date = as.POSIXct(Date))

                  Date rain_mm
1  2016-07-01 01:00:00       3
2  2016-07-02 01:00:00       6
3  2016-07-03 01:00:00       8
4  2016-07-04 01:00:00      12
5  2016-07-05 01:00:00       0
6  2016-07-06 01:00:00       0
7  2016-07-07 01:00:00      34
8  2016-07-08 01:00:00      23
9  2016-07-09 01:00:00       5
10 2016-07-10 01:00:00       1

但是,这会为每个日期提供 01:00 的时间。我宁愿有 00:00。我可以在as.POSIXct 函数调用中更改它,还是必须在之后使用单独的函数来更改?我认为这与tz = "" 有关,但无法弄清楚。

如何将类Date 转换为POSIXct 以使生成的时间为00:00?

谢谢

【问题讨论】:

  • 第一个问题可能重复:stackoverflow.com/questions/21887088/…
  • 第二个问题:尝试 tz="GMT" 或干脆删除 1 小时:as.POSIXct(Date) - 3600..
  • @ArtemSokolov 我已经看到了,但无法真正弄清楚答案。也想看看最近有没有什么变化。谢谢
  • @timat tz="GMT" 没有任何影响,我得到相同的 01:00 时间。我可以只减去一个小时的秒数,但这对我理解或使用 as.POSIXct 函数来处理更长的代码段没有帮助
  • @RoryShaw 我在对您的第二个问题的回复中添加了一个编辑,该编辑使链接示例适应您的数据并提供了一些额外的解释。

标签: r date ggplot2 posixct


【解决方案1】:

对于您的第一个问题,您可以使用this example。首先,创建数据的时滞版本:

rain_tl <- mutate( rain_data, rain_mm = lag( rain_mm ) )

然后将这个时滞版本与原始数据结合起来,重新按日期排序:

rain_all <- bind_rows( old = rain_data, new = rain_tl, .id="source" ) %>%
    arrange( Date, source ) 

(注意新创建的source 列用于打破平局,正确地将原始数据与时滞版本交错):

> head( rain_all )
  source       Date rain_mm
1    new 2016-07-01      NA
2    old 2016-07-01       3
3    new 2016-07-02       3
4    old 2016-07-02       6
5    new 2016-07-03       6
6    old 2016-07-03       8    

您现在可以使用联合矩阵来“填充”您的步骤:

ggplot(rain_data, aes(Date, rain_mm)) +
  geom_step() +
  geom_ribbon( data = rain_all, aes( ymin = 0, ymax = rain_mm ),
             fill="tomato", alpha=0.5 ):

这会产生以下情节:


对于第二个问题,问题在于as.POSIX.ct does not pass additional arguments to the converter,因此指定tz 参数不起作用。

你基本上有两种选择:

1) 将输出重新格式化为您想要的格式:format( as.POSIXct( Date ), "%F 00:00" ),它返回一个character 类型的向量。如果您想将对象类型保留为POSIXct,您可以改为...

2) 在将Date 向量传递给as.POSIX.ct 之前,将其转换为characteras.POSIXct( as.character(Date) ),但这会完全省去时间,这可能是你想要的。

【讨论】:

  • 感谢您的参与。看看上面的geom_bar 解决方案,你知道为什么我不能在与scale_x_datetime 一起使用时指定width 参数吗?
【解决方案2】:

如果您想避免黑客攻击,您可以自定义 geom_bar 表达式中的位置。

我发现了很好的结果:

ggplot(rain_data, aes(Date, rain_mm)) +
  geom_bar(stat = "identity", position = position_nudge(x = 0.51), width = 0.99) +
  scale_x_date(date_labels = "%d")

【讨论】:

  • 谢谢,我也在考虑同样的思路,将 Date 转换为 POSIXct 并将时间设置为 12:00。这使我在将多个绘图与相同的 x-aix 对齐时更容易。但是,geom_bar 似乎不接受带有scale_x_datetimewidth 参数...
  • width = 1也更好看
  • 我不喜欢width = 1 的样子。轻微的隔断很干净,显示出清晰的黎明。但是您现在拥有所需的工具
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2021-10-25
  • 2019-06-20
  • 2020-12-21
相关资源
最近更新 更多