我有一个使用 ggplot2 创建的多线图,在 R 代码中具有自动绘图和绘图功能。我想在图表上的每条线上添加一个点。我正在绘制的数据框属于 xts 类。在下面的玩具示例中,我想在"aa"线(红色(上的 2019-12-22 和"bb"线(蓝色(上的 2019-12-24 处添加一个点。点的日期位于命名向量"my_points"中。我该怎么做??
library("xts")
library("ggplot2")
library("plotly")
my_dates <- as.Date(18250:18256)
## My points are in a named vector ...
my_points <- c(my_dates[3], my_dates[5])
names(my_points) <- c("aa", "bb")
## The toy data for the example created as an xts object
my_df <- data.frame(aa = c(14,12,23,14,15,26,17),
bb = c(14.2, 16.0, 12.3, 13.8, 10.1, 9.6, 8.9))
my_xts <- xts(my_df, order.by = my_dates)
## Plotted using autoplot and plotly to make it interactive
p <- autoplot(my_xts, facets = NULL)
pl <- ggplotly(p)
print(pl)
也许更好和更通用的方法是将数据融化为长格式。可能有更好的方法,但这是一种灵活的方法,允许许多数据点和许多曲线,就像"真正的"问题一样。
## Prepare some data ... 2 straightline plots
a <- c(14,12,23,14,15,26,17)
b <- c(14.2, 16.0, 12.3, 13.8, 10.1, 9.6, 8.9)
my_dates <- as.Date(18250:18256)
my_df <- data.frame(aa = a,
bb = b)
my_df1 <- as.data.frame(cbind(my_dates, my_df))
## Construct a small df for points to be plotted
plot_df2 <- data.frame(my_dates = c(my_dates[3], my_dates[5]),
variable = c("pp", "pp"),
value = c(a[3], b[5]))
## Melt the data into the long form
plot_df1 <- melt(my_df1, id.vars = "my_dates")
## Add the point information to the plot df
plot_df1 <- rbind(plot_df1, plot_df2)
p <- ggplot(data = subset(plot_df1, variable == c("aa", "bb")),
aes(x = my_dates, y = value,
color = variable, group = variable)) +
geom_line() +
geom_point(data = subset(plot_df1, variable == "pp"),
aes(x = my_dates, y = value), size = 2, color = "black")
pl <- ggplotly(p)
print(pl)
虽然我不建议重载自动打印和 xts 提供的便利功能,但您可以按如下方式完成它:
my_xts_points_aa = my_xts[my_points[1],]
my_xts_points_bb = my_xts[my_points[2],]
p <- autoplot(my_xts, facets = NULL) +
geom_point(data=my_xts_points_aa,aes(y=aa)) +
geom_point(data=my_xts_points_bb,aes(y=bb))
p
我个人对此解决方案的保留意见是,由于您的数据以宽格式(aa 和 bb 列而不是带有键 aa 或 bb 的值列(组织的方式,感觉有点笨拙/手动。然而,xts 对象上的自动绘图会自动处理此问题,并以静默方式引入序列分类变量。不过,我希望这有所帮助 - 可能有一种直接使用 autoplot-xts 工具的方法。