У меня есть CSV-файл с 10 образцами почвы.каждый образец имеет некоторые параметры, такие как OM и Clay, и, кроме того, имеет спектр (от 400 до 750).Я пытаюсь создать приборную панель из 3 разделов:
- График зависимости глины от песка
- статистика данных
- график спектра от 400 до 750.
и я хотел бы, чтобы данные статистики и график спектра автоматически обновлялись, когда я наводил курсор на определенную точку на первом графике.Я смог сделать это со статистическими данными, однако я не смог сделать это со спектром.Я не знаю, правильно ли я читал данные или у меня была проблема с обратным вызовом.
Я новичок в python и dash, поэтому мне нужна ваша помощь. Спасибо
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly
import plotly.plotly as py
import plotly.graph_objs as go
import plotly.offline as pyo
import pandas as pd
import cufflinks as cf
from dash.dependencies import Input, Output
app = dash.Dash()
df = pd.read_csv('test_GitHub.csv', index_col=None, na_values=['NA'],sep=',',low_memory=False)
app.layout = html.Div([ #global title
html.Div([ #header
html.H1('Title'),
html.H3('Additional title')
]),
html.Div([
dcc.Graph(
id = 'test_scatter',
figure = {
'data': [go.Scatter(
x = df['Clay'],
y = df['Sand'],
text = df['Soil'],
hoverinfo = ['text','x','y'],
mode = 'markers'
)],
'layout': go.Layout(
title = 'Plot',
xaxis = {'title': 'Clay'},
yaxis = {'title': 'Sand'},
hovermode = 'closest'
)}),
dcc.Markdown(
id = 'stats',
),
dcc.Graph(
id = 'spec',
figure = {
'data': [go.Scatter(
x = df['400':'750'],
y = df.iloc[soil_index]['400':'750'],
text = df['Soil'],
hoverinfo = ['text','x','y'],
mode = 'markers'
)],
'layout': go.Layout(
title = 'Spectrum',
xaxis = {'title': 'Wavelength (nm)'},
yaxis = {'title': 'Value'},
hovermode = 'closest'
)})
],style = {'width': '50%', 'height': '50%', 'display': 'inline-block'})])
@app.callback(
Output('stats', 'children'),
[Input('test_scatter','hoverData')])
def callback_stats(hoverData):
soil_index = hoverData['points'][0]['pointIndex']
stats = """
The soil is located in Latitude {} and Longitude {} and contains:
{}(%) Organic Matter
{}(% wt.) Clay
{}(% wt.) Silt
{}(% wt.) Sand
""".format(df.iloc[soil_index]['OM'],
df.iloc[soil_index]['Clay'],
df.iloc[soil_index]['Silt'],
df.iloc[soil_index]['Sand'])
return stats
@app.callback(
Output('spec', 'children'),
[Input('test_scatter','hoverData')])
def callback_spec(hoverData):
soil_index = hoverData['points'][0]['pointIndex']
return stats
if name == 'main':
app.run_server()