另一个破折号/情节困境
Posted
技术标签:
【中文标题】另一个破折号/情节困境【英文标题】:Another dash/plotly dilemma 【发布时间】:2022-01-23 23:05:30 【问题描述】:我讨厌继续发布有关 dash\plotly 的帖子,但我不明白这里出了什么问题。我已经从 plotly 站点复制并粘贴了代码,以便显示带有下拉菜单的饼图。当我创建仪表板时,有一个显示所有类别的下拉菜单,但看不到饼图。请帮助我了解出了什么问题。代码如下:
import pandas as pd
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.express as px
# This dataframe has 244 lines, but 4 distinct values for `day`
url="https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBM-DS0321EN-SkillsNetwork/datasets/spacex_launch_dash.csv"
spacex_df=pd.read_csv(url)
spacex_df.rename(columns='Launch Site':'Site', inplace=True)
app = dash.Dash(__name__)
app.layout = html.Div([
html.P("site-dropdown:"),
dcc.Dropdown(
id='Site',
value='Site',
options=['value': x, 'label': x
for x in ['CCAFS LC-40', 'CCAFS SLC-40', 'KSC LC-39A', 'VAFB SLC-4E']],
clearable=False
),
dcc.Graph(id="pie-chart"),
])
@app.callback(
Output("pie-chart", "figure"),
[Input("Launch Site", "value")])
def generate_chart(Site, values):
fig = px.pie(spacex_df, values='Site', names='Site')
return fig
app.run_server()
【问题讨论】:
我查看了您的 DataFrame,但对您想要在饼图中显示的内容感到有些困惑。'Site'
列都是字符串,因此将参数values='Site'
传递给px.pie
是没有意义的。如果我没记错的话,唯一包含值的列是Payload Mass (kg)
。此外,当您从下拉菜单中选择特定的Site
并按该站点对您的 DataFrame 进行子集化时,那么您的饼图的不同部分应该是什么?
它旨在显示每个发射场的全部成功和失败。所以列'class'应该有一个成功的0和失败的1。但是,我还没有做那一点,因为主要集中在为什么根本没有显示饼图。您认为这与不同行业的情况有关吗?
您的代码存在一些问题:您的 generate_chart
函数应该有一个输入而不是两个,并且您调用 px.pie
时使用的列参数与列类型不一致
【参考方案1】:
我认为您的代码的主要问题是您的 generate_chart
函数有两个参数,但 @app.callback
装饰器只有一个输入参数,而对于 px.pie 中的 values
参数,您需要传递一个列名,其值可以加在一起。在这种情况下使用 px.pie 的一个问题是,如果您对“类”列中的值求和,则成功的 0 总和为 0。
由于您在评论中解释说,您真正希望在饼图中显示的是成功和失败的计数('class'
列中的 0 和 1),我认为总结起来最容易特定 'Site'
的 0 和 1 的数量,并将参数 labels=['success','failure']
和 values=[success_count, failure_count]
传递给 go.Pie
。
import pandas as pd
import dash
from dash import html, dcc
from dash.dependencies import Input, Output
import plotly.graph_objects as go
import plotly.express as px
# This dataframe has 244 lines, but 4 distinct values for `day`
url="https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBM-DS0321EN-SkillsNetwork/datasets/spacex_launch_dash.csv"
spacex_df=pd.read_csv(url)
spacex_df.rename(columns='Launch Site':'Site', inplace=True)
app = dash.Dash(__name__)
app.layout = html.Div([
html.P("site-dropdown:"),
dcc.Dropdown(
id='Site',
value='Site',
options=['value': x, 'label': x
for x in ['CCAFS LC-40', 'CCAFS SLC-40', 'KSC LC-39A', 'VAFB SLC-4E']],
clearable=False
),
dcc.Graph(id="pie-chart"),
])
@app.callback(
Output("pie-chart", "figure"),
[Input("Site", "value")])
def generate_chart(value):
pie_data = spacex_df[spacex_df['Site'] == value]
success_count = sum(pie_data['class'] == 0)
failure_count = sum(pie_data['class'] == 1)
fig = go.Figure(data=[go.Pie(labels=['success','failure'], values=[success_count, failure_count])])
fig.update_layout(title=f"Site: value")
return fig
if __name__ == '__main__':
app.run_server(debug=True)
【讨论】:
以上是关于另一个破折号/情节困境的主要内容,如果未能解决你的问题,请参考以下文章