I have a dash plot that includes two distributions and I want a vertical line to indicate the mean of the first distribution. I’d like all three pieces to be updated with a slider callback.
This plotting function successfully gets called by a callback initiated by a slider in my app. dist1, dist2, and dist1_mean all get updated, but regardless of the slider position, the vertical line stays fixed at its initial value. It’s like the add_vline isn’t getting updated with the callback even though a new fig object is presumably being created each time.
I’ve confirmed dist1_mean is changing depending on the filter and slider value.
def plot_distribution_slider(self, df, filter_ind, slider_ind):
filter = (#filter_ind#)
dist1 = df.loc[filter, 'dist1_cols'].iloc[slider_ind]
dist2 = df.loc[filter, 'dist2_cols'].iloc[slider_ind]
dist1_mean = df.loc[filter, 'dist1_mean_col'].iloc[slider_ind]
x_axes = list(range(#, #))
fig = go.Figure()
# Distribution 1
fig.add_trace(
go.Scatter(
x=x_axes,
y=dist1,
name='dist1'
)
)
# Distribution 2
fig.add_trace(
go.Scatter(
x=x_axes,
y=dist2,
name='dist2'
)
)
fig.update_layout(
####
)
fig.add_vline(
x=dist1_mean,
)
return fig
My callback, fwiw:
@app.callback(
Output('distributions', 'figure'),
Input('all-data-graph', 'clickData'),
Input('time-slider', 'drag_value'))
def update_distribution(click, slider_ind):
filter_ind = df.loc[df.index == click['points'][0]['x'], 'runs'].values[0]
return Plot().plot_distribution_slider(df, filter_ind, slider_ind)
I’ve had this same issue in the past with add_vline and thought maybe it was just some issue with my current environment, but it’s still not working. I fixed it previously by manually adding a line shape. But this is a verbose work-around. Id’ prefer to get this seemingly very simple feature working.
Here was my previous solution, for those having the same issue:
fig_std.update_layout(
###
shapes=[
dict(
type= 'line',
yref= 'paper', y0= 0, y1= 1,
xref= 'x',
x0= dist_mean,
x1= dist_mean,
line=dict(
color="Blue",
width=2,
dash="dashdot",
)
),
)
])
dash==1.20.0
dash-core-components==1.16.0
dash-html-components==1.1.3
dash-renderer==1.9.1
dash-table==4.11.3
plotly==4.14.3
Edit:
I seem to have isolated the bug. When I fix the y-axis, the vertical line doesn’t get updated. If I then adjust the plot by zooming in etc, the vertical line gets updated. Here is the culprit:
fig.update_layout(
yaxis=dict(
range=[-1, 50]
),
)
Regardless of whether I fix the yaxis before or after setting the vertical line, it’s failing to update.