使用 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
之前将其转换为 character
:as.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")
我有一些连续收集的降雨数据,我根据这些数据计算了每日总量。这是一些玩具数据:
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
之前将其转换为 character
:as.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")