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=g1
的 dcc.Graph
对象。但是,这只能是一个数字,而不是它们的列表。
解决此问题的替代方法的一些建议:
- 使用
plotly.subplots.make_subplots
创建单个图形,其中您当前的 9 个图形中的每一个都是单个子图。
- 在布局中使用多个
dcc.Graph
个对象,每个图一个。
- 如果您不需要在代码中的任何其他位置访问图表,您可以在其中创建 9 个
dcc.Graph
对象并将它们作为列表传递到容器 Div
布局。
无论您选择尝试什么,我建议先尝试使用一些虚拟数据,只有在弄清楚基本布局后才开始合并“真实”数据。
我正在创建一个 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=g1
的 dcc.Graph
对象。但是,这只能是一个数字,而不是它们的列表。
解决此问题的替代方法的一些建议:
- 使用
plotly.subplots.make_subplots
创建单个图形,其中您当前的 9 个图形中的每一个都是单个子图。 - 在布局中使用多个
dcc.Graph
个对象,每个图一个。 - 如果您不需要在代码中的任何其他位置访问图表,您可以在其中创建 9 个
dcc.Graph
对象并将它们作为列表传递到容器Div
布局。
无论您选择尝试什么,我建议先尝试使用一些虚拟数据,只有在弄清楚基本布局后才开始合并“真实”数据。