如何更改先知情节中的线条类型?
How to change type of line in prophet plot?
Facebook 的 Prophet in R(还有一个 Python 版本)用于生成时间序列预测。
模型 m
创建者:
m <- prophet(df)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)
plot(m, forecast)
其中 returns 格式非常漂亮的图形,例如:
我想更改线型,不是点而是普通的细线。
我试过这个
lines(m$history$y,lty=1)
但是出现错误
In doTryCatch(return(expr), name, parentenv, handler)
有没有关于如何将这些点转换成线的建议?
prophet
对象的 plot
方法使用 ggplot2
,因此像 lines()
这样的基本 R 图形函数将不起作用。您可以使用 ggplot2::geom_line()
到 add 行,但目前我没有看到一种简单的方法来 replace 点...
示例来自 ?prophet
:
history <- data.frame(ds = seq(as.Date('2015-01-01'), as.Date('2016-01-01'), by = 'd'),
y = sin(1:366/200) + rnorm(366)/10)
m <- prophet(history)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)
pp <- plot(m,forecast)
添加行:
library(ggplot2)
pp + geom_line()
This question 提供了一个(hacky)前进的方向:
pp2 <- pp + geom_line()
qq2 <- ggplot_build(pp2)
qq2$data[[2]]$colour <- NA
plot(ggplot_gtable(qq2))
但很明显黑客出了问题。更好的选择是查看 plot 方法(prophet:::plot.prophet
)并将其修改为您想要的行为......这是基本版本:
df <- prophet:::df_for_plotting(m, forecast)
gg <-ggplot(df, aes(x = ds, y = y)) + labs(x = "ds", y = "y")
gg <- gg + geom_ribbon(ggplot2::aes(ymin = yhat_lower,
ymax = yhat_upper), alpha = 0.2, fill = "#0072B2",
na.rm = TRUE)
## replace first geom_point() with geom_line() in next line ...
gg <- gg + geom_line(na.rm = TRUE) + geom_line(aes(y = yhat),
color = "#0072B2", na.rm = TRUE) + theme(aspect.ratio = 3/5)
我可能已经删除了您 data/forecast 中存在的一些组件,但是...
可以使用 dyplot.prophet(m, forecast)
(html 版本的情节)进行此类操作 :) 在此之前,我们应该像这里一样重写函数:
dyplot.prophet <- function(x, fcst, uncertainty=TRUE,
...)
{
forecast.label='Predicted'
actual.label='Actual'
# create data.frame for plotting
df <- prophet:::df_for_plotting(x, fcst)
# build variables to include, or not, the uncertainty data
if(uncertainty && exists("yhat_lower", where = df))
{
colsToKeep <- c('y', 'yhat', 'yhat_lower', 'yhat_upper')
forecastCols <- c('yhat_lower', 'yhat', 'yhat_upper')
} else
{
colsToKeep <- c('y', 'yhat')
forecastCols <- c('yhat')
}
# convert to xts for easier date handling by dygraph
dfTS <- xts::xts(df %>% dplyr::select_(.dots=colsToKeep), order.by = df$ds)
# base plot
dyBase <- dygraphs::dygraph(dfTS)
presAnnotation <- function(dygraph, x, text) {
dygraph %>%
dygraphs::dyAnnotation(x, text, text, attachAtBottom = TRUE)
}
dyBase <- dyBase %>%
# plot actual values
dygraphs::dySeries(
'y', label=actual.label, color='black',stepPlot = TRUE, strokeWidth=1
) %>%
# plot forecast and ribbon
dygraphs::dySeries(forecastCols, label=forecast.label, color='blue') %>%
# allow zooming
dygraphs::dyRangeSelector() %>%
# make unzoom button
dygraphs::dyUnzoom()
if (!is.null(x$holidays)) {
for (i in 1:nrow(x$holidays)) {
# make a gray line
dyBase <- dyBase %>% dygraphs::dyEvent(
x$holidays$ds[i],color = "rgb(200,200,200)", strokePattern = "solid")
dyBase <- dyBase %>% dygraphs::dyAnnotation(
x$holidays$ds[i], x$holidays$holiday[i], x$holidays$holiday[i],
attachAtBottom = TRUE)
}
}
return(dyBase)
}
之前的strokeWidth=0
,我们已经将其更改为strokeWidth=1
并添加了stepPlot = TRUE
整个基础代码位于此处:https://rdrr.io/cran/prophet/src/R/plot.R
Facebook 的 Prophet in R(还有一个 Python 版本)用于生成时间序列预测。
模型 m
创建者:
m <- prophet(df)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)
plot(m, forecast)
其中 returns 格式非常漂亮的图形,例如:
我想更改线型,不是点而是普通的细线。
我试过这个
lines(m$history$y,lty=1)
但是出现错误
In doTryCatch(return(expr), name, parentenv, handler)
有没有关于如何将这些点转换成线的建议?
prophet
对象的 plot
方法使用 ggplot2
,因此像 lines()
这样的基本 R 图形函数将不起作用。您可以使用 ggplot2::geom_line()
到 add 行,但目前我没有看到一种简单的方法来 replace 点...
示例来自 ?prophet
:
history <- data.frame(ds = seq(as.Date('2015-01-01'), as.Date('2016-01-01'), by = 'd'),
y = sin(1:366/200) + rnorm(366)/10)
m <- prophet(history)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)
pp <- plot(m,forecast)
添加行:
library(ggplot2)
pp + geom_line()
This question 提供了一个(hacky)前进的方向:
pp2 <- pp + geom_line()
qq2 <- ggplot_build(pp2)
qq2$data[[2]]$colour <- NA
plot(ggplot_gtable(qq2))
但很明显黑客出了问题。更好的选择是查看 plot 方法(prophet:::plot.prophet
)并将其修改为您想要的行为......这是基本版本:
df <- prophet:::df_for_plotting(m, forecast)
gg <-ggplot(df, aes(x = ds, y = y)) + labs(x = "ds", y = "y")
gg <- gg + geom_ribbon(ggplot2::aes(ymin = yhat_lower,
ymax = yhat_upper), alpha = 0.2, fill = "#0072B2",
na.rm = TRUE)
## replace first geom_point() with geom_line() in next line ...
gg <- gg + geom_line(na.rm = TRUE) + geom_line(aes(y = yhat),
color = "#0072B2", na.rm = TRUE) + theme(aspect.ratio = 3/5)
我可能已经删除了您 data/forecast 中存在的一些组件,但是...
可以使用 dyplot.prophet(m, forecast)
(html 版本的情节)进行此类操作 :) 在此之前,我们应该像这里一样重写函数:
dyplot.prophet <- function(x, fcst, uncertainty=TRUE,
...)
{
forecast.label='Predicted'
actual.label='Actual'
# create data.frame for plotting
df <- prophet:::df_for_plotting(x, fcst)
# build variables to include, or not, the uncertainty data
if(uncertainty && exists("yhat_lower", where = df))
{
colsToKeep <- c('y', 'yhat', 'yhat_lower', 'yhat_upper')
forecastCols <- c('yhat_lower', 'yhat', 'yhat_upper')
} else
{
colsToKeep <- c('y', 'yhat')
forecastCols <- c('yhat')
}
# convert to xts for easier date handling by dygraph
dfTS <- xts::xts(df %>% dplyr::select_(.dots=colsToKeep), order.by = df$ds)
# base plot
dyBase <- dygraphs::dygraph(dfTS)
presAnnotation <- function(dygraph, x, text) {
dygraph %>%
dygraphs::dyAnnotation(x, text, text, attachAtBottom = TRUE)
}
dyBase <- dyBase %>%
# plot actual values
dygraphs::dySeries(
'y', label=actual.label, color='black',stepPlot = TRUE, strokeWidth=1
) %>%
# plot forecast and ribbon
dygraphs::dySeries(forecastCols, label=forecast.label, color='blue') %>%
# allow zooming
dygraphs::dyRangeSelector() %>%
# make unzoom button
dygraphs::dyUnzoom()
if (!is.null(x$holidays)) {
for (i in 1:nrow(x$holidays)) {
# make a gray line
dyBase <- dyBase %>% dygraphs::dyEvent(
x$holidays$ds[i],color = "rgb(200,200,200)", strokePattern = "solid")
dyBase <- dyBase %>% dygraphs::dyAnnotation(
x$holidays$ds[i], x$holidays$holiday[i], x$holidays$holiday[i],
attachAtBottom = TRUE)
}
}
return(dyBase)
}
之前的strokeWidth=0
,我们已经将其更改为strokeWidth=1
并添加了stepPlot = TRUE
整个基础代码位于此处:https://rdrr.io/cran/prophet/src/R/plot.R