in python/prophet/plot.py [0:0]
def get_seasonality_plotly_props(m, name, uncertainty=True):
"""Prepares a dictionary for plotting the selected seasonality with Plotly
Parameters
----------
m: Prophet model.
name: Name of the component to plot.
uncertainty: Optional boolean to plot uncertainty intervals, which will
only be done if m.uncertainty_samples > 0.
Returns
-------
A dictionary with Plotly traces, xaxis and yaxis
"""
prediction_color = '#0072B2'
error_color = 'rgba(0, 114, 178, 0.2)' # '#0072B2' with 0.2 opacity
line_width = 2
zeroline_color = '#AAA'
# Compute seasonality from Jan 1 through a single period.
start = pd.to_datetime('2017-01-01 0000')
period = m.seasonalities[name]['period']
end = start + pd.Timedelta(days=period)
if (m.history['ds'].dt.hour == 0).all(): # Day Precision
plot_points = np.floor(period).astype(int)
elif (m.history['ds'].dt.minute == 0).all(): # Hour Precision
plot_points = np.floor(period * 24).astype(int)
else: # Minute Precision
plot_points = np.floor(period * 24 * 60).astype(int)
days = pd.to_datetime(np.linspace(start.value, end.value, plot_points, endpoint=False))
df_y = seasonality_plot_df(m, days)
seas = m.predict_seasonal_components(df_y)
traces = []
traces.append(go.Scatter(
name=name,
x=df_y['ds'],
y=seas[name],
mode='lines',
line=go.scatter.Line(color=prediction_color, width=line_width)
))
if uncertainty and m.uncertainty_samples and (seas[name + '_upper'] != seas[name + '_lower']).any():
traces.append(go.Scatter(
name=name + '_upper',
x=df_y['ds'],
y=seas[name + '_upper'],
mode='lines',
line=go.scatter.Line(width=0, color=error_color)
))
traces.append(go.Scatter(
name=name + '_lower',
x=df_y['ds'],
y=seas[name + '_lower'],
mode='lines',
line=go.scatter.Line(width=0, color=error_color),
fillcolor=error_color,
fill='tonexty'
))
# Set tick formats (examples are based on 2017-01-06 21:15)
if period <= 2:
tickformat = '%H:%M' # "21:15"
elif period < 7:
tickformat = '%A %H:%M' # "Friday 21:15"
elif period < 14:
tickformat = '%A' # "Friday"
else:
tickformat = '%B %e' # "January 6"
range_margin = (df_y['ds'].max() - df_y['ds'].min()) * 0.05
xaxis = go.layout.XAxis(
tickformat=tickformat,
type='date',
range=[df_y['ds'].min() - range_margin, df_y['ds'].max() + range_margin]
)
yaxis = go.layout.YAxis(title=go.layout.yaxis.Title(text=name),
zerolinecolor=zeroline_color)
if m.seasonalities[name]['mode'] == 'multiplicative':
yaxis.update(tickformat='%', hoverformat='.2%')
return {'traces': traces, 'xaxis': xaxis, 'yaxis': yaxis}