По сути, это не «библиотека визуализации статистических данных», как морская, поэтому вы должны подготовить трассы, прежде чем строить. Для вашего данного примера вы можете сделать что-то вроде
import pandas as pd
import plotly.graph_objs as go
x = [0,0,0,1,1,1,2,2,2]
y = [1,2,3,4,5,6,7,8,9]
df = pd.DataFrame({"x": x, "y": y})
grp = df.groupby("x").agg({"y":{"mean", "min", "max"}})
grp.columns = ["_".join(col) for col in grp.columns]
grp = grp.reset_index()
fig = go.Figure()
fig.add_trace(go.Scatter(x=grp["x"],
y=grp["y_min"],
mode='lines',
name='y_min',
opacity=0.75,
# marker = {"color":"lightblue", "width":0.5},
line=dict(color='lightblue', width=0.5),
showlegend=False
))
fig.add_trace(go.Scatter(x=grp["x"],
y=grp["y_mean"],
mode='lines',
name='prediction',
fill="tonexty",
line=dict(color='lightblue', width=2)
))
fig.add_trace(go.Scatter(x=grp["x"],
y=grp["y_max"],
mode='lines',
name='y_max',
opacity=0.75,
fill="tonexty",
line=dict(color='lightblue', width=0.5),
showlegend=False
))