Hello! I have already created a topic about heatmap live update.
To recap: I have a dataframe that updates at a rate of a few milliseconds. I would like heatmap to display this data and update every few seconds. However, the program doesn’t work correctly and after a while I get an error
Callback error updating heatmap.figure.
Initially I assumed I had written the code for the dash app wrong, but I don’t think there are any mistakes in it. Therefore, I have a question: Can this happen because the dataframe itself is updating outside of the dash app? Here is my implementation:
- I initially start the server with the app. At this stage data.raw_frame is empty.
# initialise dataframe and figure fig = go.Figure(data=go.Heatmap(z=,x=,y=)) fig.update_xaxes(range=[data.x_min,data.x_max]) fig.update_yaxes(range=[data.y_min,data.y_max]) # Build App app = JupyterDash(__name__) app.layout = html.Div( [ dcc.Graph(id="heatmap", figure=fig), dcc.Interval(id="animateInterval", interval=3*1000, n_intervals=0), ], ) @app.callback( Output("heatmap", "figure"), Input("animateInterval", "n_intervals"), ) def doUpdate(i): df = data.raw_frame.copy() z_val = df.heat_value x_val = df.x_value y_val = df.y_value return go.Figure(fig).update_traces(go.Heatmap(z=z_val, x=x_val, y=y_val)) app.run_server(mode="external", port=8051, debug=True)
- Then (in another jupyter cell) I run code that fills my dataframe within the given limits. Let it be filled with random numbers for simplicity
data.iter_setup() for i in range(len(data.load)): data.write(load = data.load[i], frequency = data.frequency[i], response = np.random.rand()) time.sleep(0.0001)
Thus, every iteration new values are added to the data.raw_frame, and every few seconds the App accesses this dataframe and builds a heatmap based on it. That’s why I thought, maybe the error is caused by the fact, that the dataframe is updated outside the APP?
At first I thought there couldn’t be a problem with this, since, if I understand correctly, Dash uses multithreading and it can’t be a problem for it to access any variables in the whole jupyter notebook. I would like to get your feedback on this issue.