我连续收集了一些雨量数据,我从中计算了每日总量。这是一些玩具数据:
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?有可能吗?
如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?
由于
答案 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 ):
这会产生以下情节:
对于第二个问题,问题是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.ct
:as.POSIXct( as.character(Date) )
,但这样可以完全免除时间,这可能就是你无论如何都要。
答案 1 :(得分:1)