为时间序列数据中的不同日期添加多个 vlan
Adding multiple vlines for different dates in timeseries data
我正在尝试绘制包含多个时间序列数据的折线图,其中每条线显示特定对象随时间的销售趋势 - 在相同的开始日期和结束日期内。我的数据集已经是 "melted" 形式,看起来像这样:
'data.frame': 468 obs. of 3 variables:
$ date : Date, format: "2019-04-11" "2019-04-12" "2019-04-13" ...
$ Object : chr "Object1" "Object2" "Object3" "Object 4" ...
$ daily_sales: int 1 257 178 177 255 240 231 214 193 174 ...
我有一组需要垂直线的日期,它们存储在日期数组中,imp.dates
当我尝试绘制单个 vline
时,它工作正常(使用以下代码):
ggplot(df, aes(x=date,
y=daily_sales,
colour=Object,
group=Object)) +
geom_line() +
geom_vline(aes(xintercept=imp.dates[1]),
linetype=4,
colour="black")
但是,当我尝试执行多个操作时 vlines
ggplot(df, aes(x=date,
y=daily_sales,
colour=Object,
group=Object)) +
geom_line() +
geom_vline(aes(xintercept=imp.dates),
linetype=4,
colour="black")
我收到以下错误:
Error: Aesthetics must be either length 1 or the same as the data (40): xintercept
以下是我查看过但无济于事的 SO 帖子:
1.
2.
3.How to get a vertical geom_vline to an x-axis of class date?
3 非常接近,但我的 x
变量是 class Date
而不是 int
,所以似乎无法让它工作。
任何帮助将不胜感激。
您需要将 imp.dates
放入数据框中并更改 geom_vline()
层的数据。
这是一些示例数据:
set.seed(2867)
df <- expand.grid(date = seq(as.Date("2019-01-01"), as.Date("2019-12-31"), by = 1L),
object = paste0("object", 1:4))
df <- transform(df, daily_sales = rpois(nrow(df), lambda = 100))
set.seed(1)
imp <- data.frame(date = sample(unique(df$date), 4))
这里我只是从系列中随机选择了4个日期作为重要日期,你可以这样做:
imp <- data.frame(date = imp.dates)
让第二个数据框使用相同的变量名是有帮助的date
,但我认为这不是必需的,只是helpful/easier 在你的头脑中解析。
现在我们按照您的方式构建绘图(请注意,我在代码中将 Object
更改为 object
)
ggplot(df, aes(x = date, y = daily_sales, colour = object, group = object)) +
geom_line() +
geom_vline(data = imp, ## 1
aes(xintercept = date), ## 2
linetype = 4, colour = "black")
请注意,在我们添加 geom_vline()
图层的 ##1
行中,我们将图层的 data
参数设置为重要日期的数据框,imp
.在 ## 2
行中,我们在 imp
中指定包含我们要绘制的日期的变量名称。其余绘图代码与您的一样。
这会产生(一团糟,它是随机数据):
但它现在包括 4 个选定的重要日期,以垂直线表示。
我正在尝试绘制包含多个时间序列数据的折线图,其中每条线显示特定对象随时间的销售趋势 - 在相同的开始日期和结束日期内。我的数据集已经是 "melted" 形式,看起来像这样:
'data.frame': 468 obs. of 3 variables:
$ date : Date, format: "2019-04-11" "2019-04-12" "2019-04-13" ...
$ Object : chr "Object1" "Object2" "Object3" "Object 4" ...
$ daily_sales: int 1 257 178 177 255 240 231 214 193 174 ...
我有一组需要垂直线的日期,它们存储在日期数组中,imp.dates
当我尝试绘制单个 vline
时,它工作正常(使用以下代码):
ggplot(df, aes(x=date,
y=daily_sales,
colour=Object,
group=Object)) +
geom_line() +
geom_vline(aes(xintercept=imp.dates[1]),
linetype=4,
colour="black")
但是,当我尝试执行多个操作时 vlines
ggplot(df, aes(x=date,
y=daily_sales,
colour=Object,
group=Object)) +
geom_line() +
geom_vline(aes(xintercept=imp.dates),
linetype=4,
colour="black")
我收到以下错误:
Error: Aesthetics must be either length 1 or the same as the data (40): xintercept
以下是我查看过但无济于事的 SO 帖子:
1.
3 非常接近,但我的 x
变量是 class Date
而不是 int
,所以似乎无法让它工作。
任何帮助将不胜感激。
您需要将 imp.dates
放入数据框中并更改 geom_vline()
层的数据。
这是一些示例数据:
set.seed(2867)
df <- expand.grid(date = seq(as.Date("2019-01-01"), as.Date("2019-12-31"), by = 1L),
object = paste0("object", 1:4))
df <- transform(df, daily_sales = rpois(nrow(df), lambda = 100))
set.seed(1)
imp <- data.frame(date = sample(unique(df$date), 4))
这里我只是从系列中随机选择了4个日期作为重要日期,你可以这样做:
imp <- data.frame(date = imp.dates)
让第二个数据框使用相同的变量名是有帮助的date
,但我认为这不是必需的,只是helpful/easier 在你的头脑中解析。
现在我们按照您的方式构建绘图(请注意,我在代码中将 Object
更改为 object
)
ggplot(df, aes(x = date, y = daily_sales, colour = object, group = object)) +
geom_line() +
geom_vline(data = imp, ## 1
aes(xintercept = date), ## 2
linetype = 4, colour = "black")
请注意,在我们添加 geom_vline()
图层的 ##1
行中,我们将图层的 data
参数设置为重要日期的数据框,imp
.在 ## 2
行中,我们在 imp
中指定包含我们要绘制的日期的变量名称。其余绘图代码与您的一样。
这会产生(一团糟,它是随机数据):
但它现在包括 4 个选定的重要日期,以垂直线表示。