未返回 Dash 的 Plotly Interactive Stacked barplot
Plotly Interactive Stacked barplot with Dash not returned
我有以下数据框 (AllTransportModes_statistics_Tram
),我想用它来制作交互式条形图(这是它的一个示例):
ContractName DepartureLineTransportMode DayGroupNumber Year Month \
441 Lidingöbanan TRAM 1 2019 1
442 Lidingöbanan TRAM 1 2019 2
443 Lidingöbanan TRAM 1 2019 3
444 Lidingöbanan TRAM 1 2019 4
445 Lidingöbanan TRAM 1 2019 5
1318 Tvärbanan TRAM 7 2020 5
1319 Tvärbanan TRAM 7 2020 6
1320 Tvärbanan TRAM 7 2020 7
1321 Tvärbanan TRAM 7 2020 8
1322 Tvärbanan TRAM 7 2020 9
count_nulls count_rows Percentage Null (%) (Imputated) \
441 0 3710 0.0
442 0 3400 0.0
443 0 3570 0.0
444 0 3400 0.0
445 0 3570 0.0
1318 77 2479 3.1
1319 240 2120 11.3
1320 431 1247 34.6
1321 454 1688 26.9
1322 75 1634 4.6
Percentage Null (%) (Non-imputated) Origin
441 37.2 Both
442 24.5 Both
443 22.9 Both
444 23.2 Both
445 20.1 Both
1318 63.3 Both
1319 67.0 Both
1320 83.5 Both
1321 78.7 Both
1322 78.0 Both
现在,我想做的是能够从下拉列表中选择三个变量(ContractName
、Year
和 DayGroupNumber
),然后分组条形图对于每个 Month
的变量 Percentage Null (%) (Non-imputated)
和 Percentage Null (%) (imputated)
(即每组柱都有其月份)。因此,为此,我编写了以下代码:
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
Avtal_options = AllTransportModes_statistics_Tram["ContractName"].unique()
Year_options =AllTransportModes_statistics_Tram["Year"].unique()
Dagtyp_options =AllTransportModes_statistics_Tram["DayGroupNumber"].unique()
app = dash.Dash()
app.layout = html.Div([
html.H2("Missing data"),
html.Div(
[
dcc.Dropdown(
id="ContractName",
options=[{
'label': i,
'value': i
} for i in Avtal_options],
value='All ContractName'),
dcc.Dropdown(
id="Year",
options=[{
'label': i,
'value': i
} for i in Year_options],
value='All Years'),
dcc.Dropdown(
id="DayGroupNumber",
options=[{
'label': i,
'value': i
} for i in Dagtyp_options],
value='All DayGroupNumbers'),
],
style={'width': '25%',
'display': 'inline-block'}),
dcc.Graph(id='funnel-graph'),
])
@app.callback(
dash.dependencies.Output('funnel-graph', 'figure'),
[dash.dependencies.Input('ContractName','value'),
dash.dependencies.Input('Year','value'),
dash.dependencies.Input('DayGroupNumber','value')])
def update_graph(ContractName,Year,DayGroupNumber):
if (ContractName == "All ContractName" & Year == "All Years" & DayGroupNumber == "All DayGroupNumbers"):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram.copy()
else:
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName'] == ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
trace1 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'],y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Imputated)'], name='Percentage Null (%) (Imputated)')
trace2 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Non-imputated)'], name='Percentage Null (%) (Non-imputated)')
return {
'data': [trace1, trace2],
'layout':
go.Layout(
title='Jämförelse saknad data'.format(ContractName).format(DayGroupNumber).format(Year),
barmode='stack')
}
if __name__ == '__main__':
app.run_server()
如您所见,如果没有选择,我有一个选项(所有 ContractName
s、Year
s 和 DayGroupNumber
s 都绘制了轨迹,否则原始df 被过滤
if (ContractName == "All ContractName" & Year == "All Years" & DayGroupNumber == "All DayGroupNumbers"):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram.copy()
else:
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName'] == ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
它不显示除此之外的任何内容
我只是不知道我做错了什么。任何帮助,将不胜感激。谢谢!
编辑:更新问题
我已经设法解决了部分问题。我现在可以管理的是使用以下更改为特征 Year
和 DayGroupNumber
更新图表:
def update_graph(ContractName,Year,DayGroupNumber):
if ((ContractName == "All ContractNames") & (Year == "All Years") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram.copy()
elif ((ContractName == "All ContractNames") & (Year == "All Years")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((ContractName == "All ContractNames") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['Year'].astype(str)==Year)]
elif ((ContractName == "All Years") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName)]
elif ((ContractName == "All ContractNames")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((ContractName == "All Years")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((ContractName == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year)]
trace1 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Imputated)'], name='Percentage Null (%) (Imputated)')
trace2 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Non-imputated)'], name='Percentage Null (%) (Non-imputated)')
return {
'data': [trace1, trace2],
'layout':
go.Layout(
title='Jämförelse saknad data'.format(ContractName),
barmode ='group')
}
但是,ContractName
的下拉菜单不起作用,而且,如果我尝试先应用它,那么其他两个也不起作用。此外,y 轴不符合比例。
这个问题的解决方案是覆盖原始数据框上所有可能的过滤器情况,即使是那些没有做出选择的情况。这是完整的代码:
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
Avtal_options = AllTransportModes_statistics_Tram["ContractName"].unique()
Year_options =AllTransportModes_statistics_Tram["Year"].astype(str).unique()
Dagtyp_options =AllTransportModes_statistics_Tram["DayGroupNumber"].astype(str).unique()
app = dash.Dash()
app.layout = html.Div([
html.H2("Saknade data för spårbunden trafik"),
html.Div(
[
dcc.Dropdown(
id="ContractName",
options=[{
'label': i,
'value': i
} for i in Avtal_options],
value='All ContractNames'
),
dcc.Dropdown(
id="Year",
options=[{
'label': i,
'value': i
} for i in Year_options],
value='All Years'
),
dcc.Dropdown(
id="DayGroupNumber",
options=[{
'label': i,
'value': i
} for i in Dagtyp_options],
value='All DayGroupNumbers',
),
],
style={'width': '25%',
'display': 'inline-block'}),
dcc.Graph(id='funnel-graph'),
])
@app.callback(
dash.dependencies.Output('funnel-graph', 'figure'),
[dash.dependencies.Input('ContractName','value'),
dash.dependencies.Input('Year','value'),
dash.dependencies.Input('DayGroupNumber','value')])
def update_graph(ContractName,Year,DayGroupNumber):
if ((ContractName == "All ContractNames") & (Year == "All Years") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram.copy()
elif ((ContractName == "All ContractNames") & (Year == "All Years")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((ContractName == "All ContractNames") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['Year'].astype(str)==Year)]
elif ((Year == "All Years") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName)]
elif ((ContractName == "All ContractNames")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((Year == "All Years")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year)]
elif ((ContractName != "All ContractNames") & (Year != "All Years") & (DayGroupNumber != "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
trace1 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Imputated)'], name='Percentage Null (%) (Imputated)')
trace2 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Non-imputated)'], name='Percentage Null (%) (Non-imputated)')
return {
'data': [trace1, trace2],
'layout':
go.Layout(
title='Jämförelse saknad data'.format(ContractName),
barmode ='group')
}
if __name__ == '__main__':
app.run_server()
哪个 return 正确的条形图
我有以下数据框 (AllTransportModes_statistics_Tram
),我想用它来制作交互式条形图(这是它的一个示例):
ContractName DepartureLineTransportMode DayGroupNumber Year Month \
441 Lidingöbanan TRAM 1 2019 1
442 Lidingöbanan TRAM 1 2019 2
443 Lidingöbanan TRAM 1 2019 3
444 Lidingöbanan TRAM 1 2019 4
445 Lidingöbanan TRAM 1 2019 5
1318 Tvärbanan TRAM 7 2020 5
1319 Tvärbanan TRAM 7 2020 6
1320 Tvärbanan TRAM 7 2020 7
1321 Tvärbanan TRAM 7 2020 8
1322 Tvärbanan TRAM 7 2020 9
count_nulls count_rows Percentage Null (%) (Imputated) \
441 0 3710 0.0
442 0 3400 0.0
443 0 3570 0.0
444 0 3400 0.0
445 0 3570 0.0
1318 77 2479 3.1
1319 240 2120 11.3
1320 431 1247 34.6
1321 454 1688 26.9
1322 75 1634 4.6
Percentage Null (%) (Non-imputated) Origin
441 37.2 Both
442 24.5 Both
443 22.9 Both
444 23.2 Both
445 20.1 Both
1318 63.3 Both
1319 67.0 Both
1320 83.5 Both
1321 78.7 Both
1322 78.0 Both
现在,我想做的是能够从下拉列表中选择三个变量(ContractName
、Year
和 DayGroupNumber
),然后分组条形图对于每个 Month
的变量 Percentage Null (%) (Non-imputated)
和 Percentage Null (%) (imputated)
(即每组柱都有其月份)。因此,为此,我编写了以下代码:
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
Avtal_options = AllTransportModes_statistics_Tram["ContractName"].unique()
Year_options =AllTransportModes_statistics_Tram["Year"].unique()
Dagtyp_options =AllTransportModes_statistics_Tram["DayGroupNumber"].unique()
app = dash.Dash()
app.layout = html.Div([
html.H2("Missing data"),
html.Div(
[
dcc.Dropdown(
id="ContractName",
options=[{
'label': i,
'value': i
} for i in Avtal_options],
value='All ContractName'),
dcc.Dropdown(
id="Year",
options=[{
'label': i,
'value': i
} for i in Year_options],
value='All Years'),
dcc.Dropdown(
id="DayGroupNumber",
options=[{
'label': i,
'value': i
} for i in Dagtyp_options],
value='All DayGroupNumbers'),
],
style={'width': '25%',
'display': 'inline-block'}),
dcc.Graph(id='funnel-graph'),
])
@app.callback(
dash.dependencies.Output('funnel-graph', 'figure'),
[dash.dependencies.Input('ContractName','value'),
dash.dependencies.Input('Year','value'),
dash.dependencies.Input('DayGroupNumber','value')])
def update_graph(ContractName,Year,DayGroupNumber):
if (ContractName == "All ContractName" & Year == "All Years" & DayGroupNumber == "All DayGroupNumbers"):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram.copy()
else:
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName'] == ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
trace1 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'],y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Imputated)'], name='Percentage Null (%) (Imputated)')
trace2 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Non-imputated)'], name='Percentage Null (%) (Non-imputated)')
return {
'data': [trace1, trace2],
'layout':
go.Layout(
title='Jämförelse saknad data'.format(ContractName).format(DayGroupNumber).format(Year),
barmode='stack')
}
if __name__ == '__main__':
app.run_server()
如您所见,如果没有选择,我有一个选项(所有 ContractName
s、Year
s 和 DayGroupNumber
s 都绘制了轨迹,否则原始df 被过滤
if (ContractName == "All ContractName" & Year == "All Years" & DayGroupNumber == "All DayGroupNumbers"):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram.copy()
else:
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName'] == ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
它不显示除此之外的任何内容
我只是不知道我做错了什么。任何帮助,将不胜感激。谢谢!
编辑:更新问题
我已经设法解决了部分问题。我现在可以管理的是使用以下更改为特征 Year
和 DayGroupNumber
更新图表:
def update_graph(ContractName,Year,DayGroupNumber):
if ((ContractName == "All ContractNames") & (Year == "All Years") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram.copy()
elif ((ContractName == "All ContractNames") & (Year == "All Years")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((ContractName == "All ContractNames") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['Year'].astype(str)==Year)]
elif ((ContractName == "All Years") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName)]
elif ((ContractName == "All ContractNames")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((ContractName == "All Years")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((ContractName == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year)]
trace1 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Imputated)'], name='Percentage Null (%) (Imputated)')
trace2 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Non-imputated)'], name='Percentage Null (%) (Non-imputated)')
return {
'data': [trace1, trace2],
'layout':
go.Layout(
title='Jämförelse saknad data'.format(ContractName),
barmode ='group')
}
但是,ContractName
的下拉菜单不起作用,而且,如果我尝试先应用它,那么其他两个也不起作用。此外,y 轴不符合比例。
这个问题的解决方案是覆盖原始数据框上所有可能的过滤器情况,即使是那些没有做出选择的情况。这是完整的代码:
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objs as go
Avtal_options = AllTransportModes_statistics_Tram["ContractName"].unique()
Year_options =AllTransportModes_statistics_Tram["Year"].astype(str).unique()
Dagtyp_options =AllTransportModes_statistics_Tram["DayGroupNumber"].astype(str).unique()
app = dash.Dash()
app.layout = html.Div([
html.H2("Saknade data för spårbunden trafik"),
html.Div(
[
dcc.Dropdown(
id="ContractName",
options=[{
'label': i,
'value': i
} for i in Avtal_options],
value='All ContractNames'
),
dcc.Dropdown(
id="Year",
options=[{
'label': i,
'value': i
} for i in Year_options],
value='All Years'
),
dcc.Dropdown(
id="DayGroupNumber",
options=[{
'label': i,
'value': i
} for i in Dagtyp_options],
value='All DayGroupNumbers',
),
],
style={'width': '25%',
'display': 'inline-block'}),
dcc.Graph(id='funnel-graph'),
])
@app.callback(
dash.dependencies.Output('funnel-graph', 'figure'),
[dash.dependencies.Input('ContractName','value'),
dash.dependencies.Input('Year','value'),
dash.dependencies.Input('DayGroupNumber','value')])
def update_graph(ContractName,Year,DayGroupNumber):
if ((ContractName == "All ContractNames") & (Year == "All Years") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram.copy()
elif ((ContractName == "All ContractNames") & (Year == "All Years")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((ContractName == "All ContractNames") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['Year'].astype(str)==Year)]
elif ((Year == "All Years") & (DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName)]
elif ((ContractName == "All ContractNames")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((Year == "All Years")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
elif ((DayGroupNumber == "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year)]
elif ((ContractName != "All ContractNames") & (Year != "All Years") & (DayGroupNumber != "All DayGroupNumbers")):
AllTransportModes_statistics_Tram_plot = AllTransportModes_statistics_Tram[(AllTransportModes_statistics_Tram['ContractName']==ContractName) & (AllTransportModes_statistics_Tram['Year'].astype(str)==Year) & (AllTransportModes_statistics_Tram['DayGroupNumber'].astype(str)==DayGroupNumber)]
trace1 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Imputated)'], name='Percentage Null (%) (Imputated)')
trace2 = go.Bar(x=AllTransportModes_statistics_Tram_plot['Month'], y=AllTransportModes_statistics_Tram_plot['Percentage Null (%) (Non-imputated)'], name='Percentage Null (%) (Non-imputated)')
return {
'data': [trace1, trace2],
'layout':
go.Layout(
title='Jämförelse saknad data'.format(ContractName),
barmode ='group')
}
if __name__ == '__main__':
app.run_server()
哪个 return 正确的条形图