Ошибка обратного вызова при обновлении рисунка в Plotly Dash — выпадающий список и выходной рисунок

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

Callback error updating loglog.figure
Traceback (most recent call last):
  File "C:\Users\nahar\AppData\Local\Temp/ipykernel_1556/982666652.py", line 63, in build_graph
    
TypeError: string indices must be integers

Я не понимаю, почему это происходит, вот код

logs = ['CALI','RDEP','GR','RHOB','NPHI','SP','DTC']
colors = ['black','firebrick','green','mediumaquamarine','royalblue','goldenrod','lightcoral']
log_cols = np.arange(1,8)


app = dash.Dash(__name__, external_stylesheets=[dbc.themes.SANDSTONE], meta_tags=[
        {"name": "viewport", "content": "width=device-width, initial-scale=1"}
    ])

server = app.server
app.config.suppress_callback_exceptions = True

app.layout = dbc.Container([
    dbc.Row([
        dbc.Col(html.H1('FORCE 2020 Well Log Challange Dashboard',
                        className='text-center mb-4'),
               width=12)
    ]),

    dbc.Row([
        dbc.Col([
            dcc.Dropdown(id='droplog',
                        options=[
                            {'label':'15/9-13','value':'well1'},
                            {'label':'15/9-15','value':'well2'},
                            {'label':'15/9-17','value':'well3'},
                            {'label':'16/1-2','value':'well4'},
                            {'label':'16/1-6 A','value':'well5'},
                            {'label':'16/10-1','value':'well6'},
                            {'label':'16/10-2','value':'well7'},
                            {'label':'16/10-3','value':'well8'},
                            {'label':'16/10-5','value':'well9'},
                            {'label':'16/11-1 ST3','value':'well10'},
                            {'label':'16/2-11 A','value':'well11'},
                            {'label':'16/2-16','value':'well12'}
                        ], multi=False, value='well1'),
            dcc.Graph(id='loglog',figure={})
        ])
        
    ]),

    dbc.Row([
        
    ])
])

@app.callback(
    Output(component_id='loglog',component_property='figure'),
    [Input(component_id='droplog',component_property='value')]
)

def build_graph(plot_chosen):
    logplot = make_subplots(rows=1, cols=len(logs), shared_yaxes=True)
    for i in range (len(logs)):
        
        if i == 1:
            logplot.add_trace(go.Scatter(x=plot_chosen[logs[i]], y=plot_chosen['DEPTH_MD'], 
                                         name=logs[i], line_color=colors[i]),row=1, col=log_cols[i])
            logplot.update_xaxes(type='log',row=1, col=log_cols[i], title_text=logs[i], 
                                 tickfont_size=12, linecolor='#585858')
        
        else:
            logplot.add_trace(go.Scatter(x=plot_chosen[logs[i]], y=plot_chosen['DEPTH_MD'], 
                                         name=logs[i], line_color=colors[i]),row=1, col=log_cols[i])
            logplot.update_xaxes(col=log_cols[i], title_text=logs[i],  linecolor='#585858')

    logplot.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True, ticks='inside', tickangle= 0)
    logplot.update_yaxes(tickmode='linear', tick0=0,dtick=250, showline=True, linewidth=2, linecolor='black', 
                         mirror=True, ticks='outside')
    logplot.update_yaxes(row=1, col=1, autorange='reversed')
    logplot.update_layout(height=750, width=1200, showlegend=False)   
    logplot.update_layout(plot_bgcolor = "rgba(0,0,0,0)", paper_bgcolor = "rgba(0,0,0,0)")
    
    return logplot

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

и используемые входные данные представлены в виде множества фреймов данных, один из которых такой для скважины 1

Я попытался запустить только определенную функцию, которая build_graph, и это сработало как шарм. Результат рисунка показан здесь

Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
14
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, я знаю, в чем проблема: переменная plot_chosen, которая является аргументом в функции build_graph, является строкой. В результате вы не можете набрать y=plot_chosen['DEPTH_MD']. Хотя после выбора 15/9-13 в раскрывающемся меню он имеет значение well1, он представляет собой не фрейм данных, а простую строку. Попробуйте создать, например, словарь с кадрами данных

dataframes = {'well1': well1, 'well2': well2, ...}

а затем выберите соответствующий DataFrame из словаря.
Так, например, когда пользователь выбирает 15/9-13 в раскрывающемся списке, вы получите plot_chosen='well1', и вы можете просто получить фрейм данных well1, используя dataframes[plot_chosen].

Спасибо большое чувак, все работает!

nrasif18 17.05.2022 22:24

Другие вопросы по теме