使用geom_step

时间:2017-02-13 17:20:50

标签: r date ggplot2 posixct

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

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")

其中包含以下内容:

enter image description here

这似乎很好。很明显,某一天的降雨量是多少。然而,也可以解释为在一天的中午和下一天的中午之间,一定量的降雨,这是错误的。如果图表与同一时期的其他相关连续变量图组合,则尤其如此。

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

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

给出了:

enter image description here

这是显示数据的更好方法,现在scale_x_date似乎是一个连续轴。然而,将这个区域放在步骤下方会很好,但似乎无法找到这样做的直接方式。

Q1:我如何填充geom_step?有可能吗?

SO question here中所述,将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 = ""有关,但无法弄明白。

如何将课程Date转换为POSIXct,以便生成的时间为00:00?

由于

2 个答案:

答案 0 :(得分:3)

关于第一个问题,您可以解决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    

您现在可以使用关节矩阵来填充&#34;你的步骤:

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 ):

这会产生以下情节:

enter image description here

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

您基本上有两个选择:

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

2)将Date向量投放到character之前将其传递给as.POSIX.ctas.POSIXct( as.character(Date) ),但这样可以完全免除时间,这可能就是你无论如何都要。

答案 1 :(得分:1)

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

enter image description here