R 如何在绘图上添加平均间隔
我有一个数据集,包含从R 如何在绘图上添加平均间隔,r,plot,R,Plot,我有一个数据集,包含从2018-04-22T11:48:53开始到2018-04-22T12:03:24结束的日期。每个时间戳都有自己的值。我需要创建一个函数,该函数接受一个data.frame,并在此基础上绘制每个间隔的实值和平均值绘图。OP已请求创建一个函数,该函数接受一个data.frame,并在此基础上绘制每个间隔的实值和平均值绘图 这就是我使用data.table进行聚合,使用scales创建“良好”间隔,使用ggplot2进行打印,使用checkmate检查输入参数来满足此要求的方法
2018-04-22T11:48:53开始到2018-04-22T12:03:24结束的日期。每个时间戳都有自己的值。我需要创建一个函数,该函数接受一个data.frame
,并在此基础上绘制每个间隔的实值和平均值绘图。OP已请求创建一个函数,该函数接受一个data.frame,并在此基础上绘制每个间隔的实值和平均值绘图
这就是我使用data.table
进行聚合,使用scales
创建“良好”间隔,使用ggplot2
进行打印,使用checkmate
检查输入参数来满足此要求的方法:
plot_avg <- function(DF, x_arg, y_arg, interval_width, show_avg = NULL) {
# check arguments
checkmate::assert_data_frame(DF, min.rows = 1L, min.cols = 2L,
col.names = "strict")
checkmate::assert_string(x_arg, min.chars = 1L)
checkmate::assert_string(y_arg, min.chars = 1L)
checkmate::assert_subset(c(x_arg, y_arg), names(DF))
checkmate::assert_number(interval_width, lower = .Machine$double.xmin)
checkmate::assert_character(show_avg, null.ok = TRUE)
checkmate::assert_subset(show_avg, c("segm", "step", ""))
# load required packages
library(data.table)
library(ggplot2)
# compute averages
breaks <- scales::fullseq(range(DF[[x_arg]]), interval_width)
aggDT <- as.data.table(DF)[
, .(avg = mean(get(y_arg))),
by = .(start = breaks[cut(get(x_arg), breaks, right = FALSE, labels = FALSE)])]
# start plotting
g <- ggplot(DF) + aes_string(x_arg, y_arg) +
geom_point(color = "blue") +
{if (length(breaks) < 30) scale_x_continuous(breaks = breaks)} +
theme_bw()
if ("segm" %in% show_avg)
g <- g + geom_segment(aes(x = start, xend = start + interval_width,
y = avg, yend = avg), aggDT)
if ("step" %in% show_avg)
g <- g + geom_step(aes(start, avg), aggDT, linetype = "dashed")
# return plot object
return(g)
}
将平均值作为水平线段:
plot_avg(DT, "sec", "value", 60L, "segm")
平均值为水平线段加上步长
plot_avg(DT, "sec", "value", 60L, c("segm", "step"))
间隔宽度可以改变:
plot_avg(DT, "sec", "value", 20L, c("segm", "step"))
资料
OP没有提供任何公开的样本数据。因此,我必须构建自己的样本数据集:
library(data.table)
secs <- seq(lubridate::ymd_hms("2018-04-22T11:48:53"),
lubridate::ymd_hms("2018-04-22T12:03:24"),
by = "sec")
n_secs <- length(secs)
n_row <- as.integer(n_secs / 10)
set.seed(0)
DT <- data.table(times = sort(sample(secs, n_row)))
DT[, sec := as.integer(times - min(times))]
f <- 2*pi/n_secs
DT[, value := cos(f*sec) + sin(2*f*sec) + 0.1 * rnorm(.N)]
库(data.table)
我已经记住了间隔秒,例如60秒,这个周期内的avarege值添加了图像和一些标记
library(data.table)
secs <- seq(lubridate::ymd_hms("2018-04-22T11:48:53"),
lubridate::ymd_hms("2018-04-22T12:03:24"),
by = "sec")
n_secs <- length(secs)
n_row <- as.integer(n_secs / 10)
set.seed(0)
DT <- data.table(times = sort(sample(secs, n_row)))
DT[, sec := as.integer(times - min(times))]
f <- 2*pi/n_secs
DT[, value := cos(f*sec) + sin(2*f*sec) + 0.1 * rnorm(.N)]