Python 返回多个图表的函数不起作用

Python function returning multiple graphs is not working

我正在创建一个 returns 多个图表(总共 9 个)的函数。我需要在 plotlys 仪表板中查看图表。当我 运行 代码时,空白图表即将到来。请看附图。我希望该网页上有 9 个不同的图表。

请看下面我的代码。我可以知道我哪里出错了吗?我的示例数据集可在此处获得[]

请看下面我的代码

    import plotly as py
    import plotly
    import cufflinks as cf
    import pandas as pd
    import numpy as np
    from plotly.offline import download_plotlyjs, init_notebook_mode,plot, iplot
    init_notebook_mode(connected=True)
    cf.go_offline()
    
    import dash
    import dash_core_components as dcc
    import dash_html_components as html
    from dash.dependencies import Input,Output
    import plotly.graph_objects as go
    app = dash.Dash(__name__)
    
    def _create_fig():
        
        df_Noise=pd.read_csv('Funct_Noise_Corners_2p0_A.txt',delim_whitespace=True)
        df_noise_50 = df_Noise[(df_Noise['Temp(deg)'] == -20)| (df_Noise['Temp(deg)'] == 25)| (df_Noise['Temp(deg)'] == 50)]
        df_50_08_16 = df_noise_50[(df_noise_50['Frequency[MHz]'] == 0.8)| (df_noise_50['Frequency[MHz]'] == 1.6)]
        df_50_08_16_PVT=pd.pivot_table(df_50_08_16, index = ['Device_ID', 'Temp(deg)' ,'Supply[V]'],columns='Frequency[MHz]',values = 'NoiseLevel[dB]')
        df_50_08_16_PVT['SPEC_MAX']=-96.5
        fig0=df_50_08_16_PVT.iplot(asFigure=True,title='NOISE@_0.8Mhz_1.6MhzTemp_Range_Upto_50Deg')
        
        df_50_04_24_48 = df_noise_50[(df_noise_50['Frequency[MHz]'] == 2.4)| (df_noise_50['Frequency[MHz]'] == 4.8)| (df_noise_50['Frequency[MHz]'] == 0.4)]
        df_50_04_24_48_PVT=pd.pivot_table(df_50_04_24_48 , index = ['Device_ID', 'Temp(deg)' ,'Supply[V]'],columns='Frequency[MHz]',values = 'NoiseLevel[dB]')
        df_50_04_24_48_PVT['SPEC_MAX']=-99.5
        fig1=df_50_04_24_48_PVT.iplot(asFigure=True,title='NOISE@_0.4Mhz_2.4Mhz_4.8Mhz_Temp_Range_Upto_50Deg')
        
        df_8_16 = df_Noise[(df_Noise['Frequency[MHz]'] == 0.8)| (df_Noise['Frequency[MHz]'] == 1.6)]
        df_8_16_PVT=pd.pivot_table(df_8_16 , index = ['Device_ID', 'Temp(deg)' ,'Supply[V]'],columns='Frequency[MHz]',values = 'NoiseLevel[dB]')
        df_8_16_PVT['SPEC_MAX']=-96.5
        fig2=df_8_16_PVT.iplot(asFigure=True,title='NOISE@_0.8Mhz_1.6Mhz_All_Temp_Range')
        
        df_04_24_48 = df_Noise[(df_Noise['Frequency[MHz]'] == 2.4)| (df_Noise['Frequency[MHz]'] == 4.8)| (df_Noise['Frequency[MHz]'] == 0.4)]
        df_04_24_48_PVT=pd.pivot_table(df_04_24_48 , index = ['Device_ID', 'Temp(deg)' ,'Supply[V]'],columns = 'Frequency[MHz]',values = 'NoiseLevel[dB]')
        df_04_24_48_PVT['SPEC_MAX']=-99.5
        fig3=df_04_24_48_PVT.iplot(asFigure=True,title='NOISE@_0.4Mhz_2.4Mhz_4.8Mhz_All_Temp_Range')
        
        df_TDEN=pd.read_csv('Funct_TDEN_Corners_2p0_A.txt',delim_whitespace=True)
        df_TDEN_PVT = pd.pivot_table(df_TDEN, index = ['Device_ID', 'Temp(deg)' ,'Supply[V]'],columns='Frequency[MHz]',values =['TDEN_Rise[ns]','TDEN_Fall[ns]'] )
        df_TDEN_PVT['SPEC_MAX']=80
        df_TDEN_PVT['SPEC_MIN']=50
        fig4=df_TDEN_PVT.iplot(asFigure=True,title='TDEN_CAP_LOAD_50pF')
        
        df_RT_FT_04=df_TDEN[(df_TDEN['Frequency[MHz]'] == 0.4)]
        df_RT_FT_04_PVT = pd.pivot_table(df_RT_FT_04,index = ['Device_ID', 'Temp(deg)' ,'Supply[V]','Frequency[MHz]'],values =['Risetime[ns]','Falltime[ns]'] )
        fig5=df_RT_FT_04_PVT.iplot(asFigure=True,title='RT_FT_0.4Mhz_LOAD_50pF')
        
        df_RT_FT_24=df_TDEN[(df_TDEN['Frequency[MHz]'] == 2.4)]
        df_RT_FT_24_PVT = pd.pivot_table(df_RT_FT_24,index = ['Device_ID', 'Temp(deg)' ,'Supply[V]','Frequency[MHz]'],values =['Risetime[ns]','Falltime[ns]'] )
        df_RT_FT_24_PVT['SPEC_MAX']=80
        df_RT_FT_24_PVT['SPEC_MIN']=40
        fig6=df_RT_FT_24_PVT.iplot(asFigure=True,title='RT_FT_2.4Mhz_LOAD_50pF')
        
        df_RT_FT_37=df_TDEN[(df_TDEN['Frequency[MHz]'] == 3.07)]
        df_RT_FT_37_PVT = pd.pivot_table(df_RT_FT_37,index = ['Device_ID', 'Temp(deg)' ,'Supply[V]','Frequency[MHz]'],values =['Risetime[ns]','Falltime[ns]'] )
        df_RT_FT_37_PVT['SPEC_MAX'] =35
        df_RT_FT_37_PVT['SPEC_MIN'] =23
        fig7=df_RT_FT_37_PVT.iplot(asFigure=True,title='RT_FT_3.07Mhz_LOAD_50pF')
        
        df_TDH_RT=pd.read_csv('Funct_TDH_RISE_Corners_2p0_A.txt',delim_whitespace=True)
        df_TDH_RT_PVT = pd.pivot_table(df_TDH_RT,index = ['Device_ID', 'Temp(deg)' ,'Supply[V]'],columns='Frequency[MHz]',values =['TDH_Rise[ns]'] )
        df_TDH_RT_PVT['SPEC_MIN']=5
        df_TDH_RT_PVT['SPEC_MAX']=30 
        fig8 = df_TDH_RT_PVT.iplot(asFigure=True,title='TDH_RISE',width=3)   
     
    
        
        fig=[fig0,fig1,fig2,fig3,fig4,fig5,fig6,fig7,fig8]    
           
        return fig
    
    app.layout = html.Div([
        dcc.Graph(
            id='g1',
            figure=_create_fig()),
        dcc.Interval(
            id='interval-component',
            interval=1*1000, # in milliseconds
            n_intervals=0
        )
    ])
    
    
    @app.callback(
        dash.dependencies.Output('g1', 'figure'),
        dash.dependencies.Input('interval-component', 'n_intervals'))
    def refresh_data(n_clicks):
        return _create_fig()
    
    
    if __name__ == "__main__":
        app.run_server()

使用上述代码得到的图

首先,如果您在 运行 主服务器中使用 app.run_server(debug=True) 进行开发,您将能够找到有关 Dash 代码中任何错误的更多提示。

对于您的情况,您应该会看到如下错误消息:

Invalid argument `figure` passed into Graph with ID "g1".
Expected `object`.
Was supplied type `array`.

事实上,您正在将数字列表作为 figure 传递给带有 id=g1dcc.Graph 对象。但是,这只能是一个数字,而不是它们的列表。

解决此问题的替代方法的一些建议:

  1. 使用 plotly.subplots.make_subplots 创建单个图形,其中您当前的 9 个图形中的每一个都是单个子图。
  2. 在布局中使用多个 dcc.Graph 个对象,每个图一个。
  3. 如果您不需要在代码中的任何其他位置访问图表,您可以在其中创建 9 个 dcc.Graph 对象并将它们作为列表传递到容器 Div布局。

无论您选择尝试什么,我建议先尝试使用一些虚拟数据,只有在弄清楚基本布局后才开始合并“真实”数据。