Python Dash - график не обновляется при выборе нового выпадающего значения - PullRequest
0 голосов
/ 13 июня 2019

Привет, ребята,

Я - стажер-разработчик Python, и я только что узнал о Dash и Plotly, это потрясающе! Для своего приложения я использую набор данных, содержащий информацию о доходах fortune 500 за период 1955-2005 гг.

Проблема, с которой я столкнулся, заключается в том, что график не будет обновляться при выборе дополнительной компании из выпадающего списка, однако, если я выберу новую компанию и удалю предыдущую - тогда график обновится. Кажется, что-то мешает графику показывать несколько строк одновременно. Кроме того, есть ли способ добавить легенду о том, какой цвет какой компании? Ниже мой код:

import dash
import dash_html_components as html
import dash_core_components as dcc
import pandas as pd
import plotly.graph_objs as go
from dash.dependencies import Input, Output

#Read CSV and change col. names
df = pd.read_csv('fortune500-full.csv')
df.columns = ['Year', 'Rank', 'Company', 'Revenue', 'Profit']

#Get a list of unique company names
Companies = df['Company'].unique()

#Stylesheet
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

#App layout
app.layout = html.Div([
#Dropdown
html.Div([
html.Label('Dropdown'),
    dcc.Dropdown(
        id = 'Dropdown',
        options=[{'label': i, 'value': i} for i in Companies],
        value=["General Motors"],
        multi = True
    ),]),

#Graph
    dcc.Graph(
        id='Graph',
        figure={
            'data': [
                go.Scatter(
                    x=df.loc[df['Company'] == i, 'Year'],
                    y=df.loc[df['Company'] == i, 'Revenue'],
                    text =df.loc[df['Company'] == i, 'Company'],
                    mode='lines',
                    name=i
                ) for i in df.Company.unique()],

            'layout': go.Layout(
                xaxis={'title': 'Year'},
                yaxis={'title': 'Revenue'},
                margin={'l': 50, 'b': 30, 't': 10, 'r': 0},
                legend={'x': 1, 'y': 1},
                hovermode='closest'
            )}),

    html.Div(dcc.RangeSlider(
        id='Slider',
        min=df['Year'].min(),
        max=df['Year'].max(),
        value=[1955, 2005],
        marks={str(year): str(year) for year in df['Year'].unique()}
    ), style={'width': '98%', 'padding': '0px 20px 20px 20px'}),

    html.Div(id='Output_slider',
             style={'textAlign': 'center', 'color': ['#7FDBFF']}
             )])

@app.callback(
    dash.dependencies.Output('Graph', 'figure'),
    [dash.dependencies.Input('Dropdown', 'value')])

def callback_a(dropdown_value):
    trace = []
    for val in dropdown_value:
        trace.append(
            go.Scatter(
                x=df.loc[df['Company'] == val, 'Year'],
                y=df.loc[df['Company'] == val, 'Revenue'],
                text =df.loc[df['Company'] == val, 'Company'],
                mode='lines',
                name=val
            ),)
        layout = go.Layout(
            xaxis={'title': 'Year'},
            yaxis={'title': 'Revenue'},
            margin={'l': 50, 'b': 30, 't': 10, 'r': 0},
            legend={'x': 1, 'y': 1},
            hovermode='closest'
        )
        figure = {'data': trace, 'layout': layout}
        return figure


@app.callback(
    dash.dependencies.Output('Output_slider', 'children'),
    [dash.dependencies.Input('Slider', 'value')])
def update_output(value):
    return 'Wybrane lata:  "{}"'.format(value)
#App
if __name__ == '__main__':
    app.run_server(debug=True)

Не мог бы кто-нибудь из вас взглянуть на это и помочь мне найти корень этой проблемы?

С уважением.

...