使用 geom_step 绘制每日降雨数据

plotting daily rainfall data using geom_step

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

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 也可能有用,以便在多绘图中实现相同的 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 = "" 有关,但无法弄清楚。

如何从 class Date 转换为 POSIXct 以便生成的时间为 00:00?

谢谢

对于你的第一个问题,你可以解决 this example。首先,创建一个 time-lagged 版本的数据:

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

然后将这个time-lagged版本与原始数据合并,re-sort按日期:

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

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

> 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    

您现在可以使用关节矩阵 "fill" 您的步数:

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" ),其中 returns 类型为 character 的向量。如果您想将对象类型保留为 POSIXct,您可以改为...

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

如果您想避免黑客入侵,您可以自定义 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")