Callback error updating figure

Hello everyone
i need help about a strange callback error which i tried to solve since a week. The most strange with this problem is that some time that’s work and another time not. I checked all the variable and all is ok, and i also put some modification which i found here. Because my code is too long (1100 lines) i’ll put only the part which is concerned. To resume, sometime, i cannot send a figure graph object in dcc.Graph in my application layout. the error warning which i have in my browser is that: “Cannot get the “multi” property of a null or undefined reference” (it’s an english traduction because it’s writed in french in my browser.So maybe it’s not exactly correct).
Thanks you for your help ^^.
Code:

import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output, State
import dash_core_components as dcc
import dash_html_components as html
import dash_table
import pandas as pd
import plotly.graph_objects as go
from jupyter_dash import JupyterDash
import scipy.stats as stat 

def adequation(models,data):
    choix ={'Weibull model':stat.weibull_min ,'LogNormal model': stat.lognorm,'GeneralizedGamma model': stat.gamma,
           "Johnson SU" : stat.johnsonsu ,"Johnson SB": stat.johnsonsb , "Normal distribution":stat.norm,
            "Exponential" : stat.expon, "Birnbaum-Saunders distribution": stat.fatiguelife}
    x=np.linspace(data.min(),data.max(),100000)
    titles=[]
    for name in models:
        titles.append(name+" distribution")
        titles.append(name+" PP-plot")
    figure = make_subplots(rows=len(models)*2+1, cols=1, subplot_titles=titles)
    i=1
    col1,col2,col3,col4,col5,col6= list(),list(),list(),list(),list(),list()
    for value in models:
        param = choix[value].fit(data,floc = 0)
                    ##Entraine le modèle choisie par l'utilisateur, sur les données du Km_mensuel_R
                    ## le parametre loc = 0 est là  pour fixer comme 0 la valeur de départ du parametre location loc (qui correspond
                    ##a l'espérance dans le cas d'une loi normal)lors de la phase d'optimisation qu'est la maximisation de la 
                    ## vraisemblance.le zero n'est qu'une valeur temporaire de "depart", pour éviter que l'entrainement ne plante
        rvs = choix[value].rvs(size = data.shape[0], *param)
                    ##la variable rvs, est utilisé pour stocker des valeurs générer aléatoirement par le modèle choisie
                    ## avec pour paramètre les parametre estimé précédemment. D'où le *param.
                    ##rvs est utilisé pour le graphique de PP-plot pour l'adequation. rvs a donc la meme taille que le Km_mensuel
                    ## d'où le fait que sa taille est pricisé dans "size"
        kolmo = stat.ks_2samp(rvs,data)
                    ## enregistre le resultat du test de kolmogorov smirnov dans la variable kolmo sous forme de list. De sorte que 
                    #le premier élément est la statistique associée et le second la p-value
        logLik = np.sum(choix[value].logpdf(data, *param) )
                    ## calcule de la log vraisemblance, comme etant la somme (d'où le np.sum), du log de la densité
                    ##associée a chaque valeur du Km_mensuele_R. La densité est celle du modèle choisie avec les parametres
                    ##estimé. D'où le *param
        aic = 2 - 2*(logLik)
        bic = np.log(data.shape[0])- 2*(logLik)
                    ##calcul de l'aic
        y= choix[value].pdf(x, *param)
                    ## y sont les valeurs de l'ordonné pour le graphique de  la fonction de densité entrainé
        title="Density and histogram  of {} ".format(value)
        title2="PPplot  of {} ".format(value)
        figure.add_trace(go.Scatter(x= x ,  y= y,mode='lines',name='Density',
                                               marker = dict(opacity=0.8)),row=i,col=1)
        figure.add_trace(go.Histogram(x= data,name="histogram",histnorm = "probability density"),row=i,col=1 )
        i+=1
        qqplot = stat.probplot(data, dist=choix[value], sparams= param)
        figure.add_trace(go.Scatter(x= qqplot[0][1] ,y= qqplot[0][0],name='PPplot',mode='markers'),row=i,col=1) 
        figure.add_trace(go.Scatter(x= np.arange(min(qqplot[0][0]),max(qqplot[0][0])+1) ,
                                                         y= np.arange(min(qqplot[0][0]),max(qqplot[0][0])+1),
                                                         mode='lines',name = "Bissectrice"),row=i,col=1)
        i+=1
        col1.append(value)
        col2.append(round(logLik,3))
        col3.append(round(aic,3))
        col4.append(round(bic,3))
        col5.append(round(kolmo[0],3))
        col6.append(round(kolmo[1],3))
   resume = pd.DataFrame({"Model" : col1, "Log-likelihood" : col2 ,
                                       "BIC" : col4 ,"AIC" : col3 ,
                                       "Kolmogorov statistique" : col6 ,"Kolmogorov p-value": col5})
    resume.sort_values(by=["Kolmogorov p-value","Log-likelihood"], ascending = False,inplace = True)
    figure.update_layout(height=1500,showlegend=False)
    return figure,plot_table(resume)
 app = JupyterDash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP] )
    app.layout =  dbc.Container([
dcc.Graph(id='kilometrage'),
        dcc.Graph(id='synthese2')])

@app.callback([Output( 'kilometrage', 'figure'),Output( 'synthese2', 'figure')],
            [
                Input('upload-parc', 'contents'),
                Input('upload-parc', 'filename') ,
                Input('upload-roulage', 'contents'),
                Input('upload-roulage', 'filename') ,
                Input('upload-incident', 'contents'),
                Input('upload-incident', 'filename') ,
                Input('Final-button', 'n_clicks'),State('minFinal','value'),
                State('maxFinal','value'),State('zscoreFinal','value'),
                State('checkFinal','value'),State( 'modelFinal', 'value')
            ])
def update_loiKilometre(parc, parcName,roulage,roulageName,incident, incidentName,click,
                        minimum,maximum,z_score,iteration,models):
        if parc and roulage and incident and click:
            global kilometrage
            parc = parc[0]
            parcName = parcName[0]
            roulage = roulage[0]
            roulageName = roulageName[0]
            incident = incident[0]
            incidentName = incidentName[0]
            parc =  parse_data_brut(parc, parcName, data = "PARC")
            roulage = parse_data_brut(roulage , roulageName , data = "ROULAGE" )
            incident = parse_data_brut(incident , incidentName, data = "INCIDENT" ) 
            df = clean(parc,roulage,incident,filtre = True)
            ##df is a dataframe created with 3 excel Files loaded
            df = fusion_filtre(df,minimum,maximum,iteration)        
            kilometrage["minimum"],kilometrage["maximum"], kilometrage["z_score"],kilometrage["iteration"]=minimum,maximum,z_score,iteration
            fig, table = adequation(models,df.Km_2)   
            return fig,table
        else:
            #raise #PreventUpdate
            return dash.no_update