Вернуть график на основе значения из выпадающего - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь построить график matplotlib после того, как на основе значения, выбранного из раскрывающегося списка.Я сделал раскрывающийся список, и графики также готовы для значений, но я не знаю, как соединить их вместе.

Ниже приведен код раскрывающегося списка:

app.layout = html.Div([
    dcc.Dropdown(
        id='first-dropdown',
        options = [
            {'label': 'Chest Pain', 'value': 'cp'},
            {'label': 'Resting Blood Pressure', 'value': 'trestbps'},
            {'label': 'Serum Cholestrol in mg/dl', 'value': 'chol'},
            {'label': 'Fasting Blood Pressure', 'value': 'fbs'},
            {'label': 'Resting electrocardiographic results', 'value': 'restecg'},
            {'label': 'Maximum heart rate achieved', 'value': 'thalach'},
            {'label': 'Exercise induced angina', 'value': 'exang'},
            {'label': 'Old Peak', 'value': 'oldpeak'},
            {'label': 'Slope of the peak exercise ST segment', 'value': 'slope'},
            {'label': 'Number of major vessels (0-3) colored by flourosopy', 'value': 'ca'},
            {'label': 'Thalassemia', 'value': 'thal'}
        ],
        value= 'thalach'
    )
])

идля каждого значения в раскрывающемся списке у меня есть отдельная функция, которая возвращает график.Например: что я пытаюсь сделать, это если в выпадающем меню выбрана метка «Максимальная частота сердечных сокращений», значение которой «thalach».У меня есть функция plotThalach, которая возвращает график, подобный следующему:

def plotThalach(df):
    df_men = df[df['sex'] == 1.0]
    df_women = df[df['sex'] == 0.0]
    plt.figure(figsize=(20, 8))
    plt.bar(df_men['age'] + 0.00, df_men['thalach'], color='b', width=0.25, label='Men')
    plt.bar(df_women['age'] + 0.25, df_women['thalach'], color='r', width=0.25, label='Women')
    plt.legend(loc='upper right')
    plt.xlabel("Age")
    plt.ylabel("Max Heart Rate")
    plt.title("Age vs Max Heart Rate")
    return plt

Теперь, как мне соединить оба этих параметра таким образом, чтобы при выборе значения из раскрывающегося списка моя функция вызывалась и график получалотображается на экране.

1 Ответ

0 голосов
/ 12 апреля 2019

Не очень понятно, почему вы хотите смешать plotly-dash и matplotlib, вы можете легко сделать это, используя просто plotly-dash

Вот пример кода,

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

import pandas as pd
import plotly.graph_objs as go

df = pd.read_csv(
    'https://raw.githubusercontent.com/plotly/'
    'datasets/master/gapminderDataFiveYear.csv')

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)



#main div
app.layout = html.Div([

    #drop down with a default value set
    dcc.Dropdown(
        id='xaxis-column',
        options=[{'label': str(year), 'value': year} for year in df['year'].unique()],
        value=df['year'].min(),
    ),

    #graph that is to be updated
    dcc.Graph(id='graph-with-slider')

])


#callback which will be spawned when the input changes, in this case the input is the dropdown value
@app.callback(
    Output('graph-with-slider', 'figure'),
    [Input('xaxis-column', 'value')])
def update_figure(selected_year):
    filtered_df = df[df.year == selected_year]
    traces = []
    for i in filtered_df.continent.unique():
        df_by_continent = filtered_df[filtered_df['continent'] == i]
        traces.append(go.Scatter(
            x=df_by_continent['gdpPercap'],
            y=df_by_continent['lifeExp'],
            text=df_by_continent['country'],
            mode='markers',
            opacity=0.7,
            marker={
                'size': 15,
                'line': {'width': 0.5, 'color': 'white'}
            },
            name=i
        ))

    return {
        'data': traces,
        'layout': go.Layout(
            xaxis={'type': 'log', 'title': 'GDP Per Capita'},
            yaxis={'title': 'Life Expectancy', 'range': [20, 90]},
            margin={'l': 40, 'b': 40, 't': 10, 'r': 10},
            legend={'x': 0, 'y': 1},
            hovermode='closest'
        )
    }


if __name__ == '__main__':
    app.run_server(debug=True)

Но если вы хотите показать график matplotlib вместо графика plotly-dash, вы можете обратиться к разделу «Включение графиков Matplotlib» здесь

...