另一个破折号/情节困境

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)

【讨论】:

以上是关于另一个破折号/情节困境的主要内容,如果未能解决你的问题,请参考以下文章

如何在破折号/情节中使用 iframe? (Python/HTML)

1 页上的多个情节情节,没有子情节

有没有办法制作一个只显示文本的情节图?

python: dash 实况情节图例

情节:具有两行的子图中的刻度标签问题

用于情节热图的交互式 zmax?