Черточка графика Как получить ввод данных пользователем с помощью ползунка для обновления значений в графике

#python-3.x #plotly #plotly-dash #plotly-python

Вопрос:

У меня есть выходная переменная (REC2), которая обратно зависит от ряда фиксированных факторов, и входная переменная (REC1). Мой исходный код взял фиксированные коэффициенты и REC1 (жестко закодированный) и рассчитал REC2. Эта часть работает так, как мне бы хотелось.

Затем я сделал плагиат с веб-сайта Ploty Dash и придумал следующий код. График отображается правильно, но ползунок-нет. Я думаю, что это линия «отметок», но я не знаю, как ее настроить. Я бы хотел, чтобы он шел от 0 до -2000 с шагом 50.

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


Dep=363                 #Water depth (m)
Speed = 2.2             #Ship's speed (m/s)
ASV=1.5                 #Speed of sound in water (m/s)
SPI=6.25                #Distance between sample stations (m)
SB=0-((Dep*2)/ASV)      #Sound travel time to seabed (milliseconds) - negative to denote below time zero
IET=(SPI/Speed)         #Inter Event Time (s) time to travel SPI

Rmin=0
Rmax=-2000


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

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

app.layout = html.Div([
    dcc.Graph(id='graph-with-slider'),
    dcc.Slider(
        id='3DHR Slider',
        min=Rmax,
        max=Rmin,
        value=(Rmax-Rmin)/2,
        marks={i: 'Label {}'.format(i) if i == 1 else str(i) for i in range(-20000,0)},
        step=200
    )
])


@app.callback(
    Output('graph-with-slider', 'figure'),
    Input('3DHR Slider', 'value'))
def update_figure(REC1):
    REC2= ((0-IET)*1000)-REC1  #UHRS record length - Function of above

    fig = go.Figure()
    fig.add_trace(go.Scatter(
        x=[0, 1,1, 0],
        y=[0, 0, REC2, REC2],
        fill='tonexty', # fill area between trace0 and trace1
        mode='lines', line_color='indigo',name="UHRS"))
    fig.add_trace(go.Scatter(
        x=[0, 1,1, 0],
        y=[0, 0, REC1, REC1],
        fill='tonexty', # fill area between trace0 and trace1
        mode='lines', line_color='blue',name="3DHR"))
    
    fig.add_trace(go.Scatter(x=[0,1],y=[SB,SB],name="Seabed"))

    return fig


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

Ответ №1:

Я обновился, чтобы работать в среде jupyter.

  • вы создаете отметку для каждого значения в диапазоне от -2000 до 0. Затем они перекрываются, и вы получаете черную линию, которая является маркерами
  • изменено понимание диктанта, чтобы создавать отметки каждые 200
  • изменен шаг ползунка на 50, как вы заметили
 import dash
from jupyter_dash import JupyterDash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objects as go


Dep=363                 #Water depth (m)
Speed = 2.2             #Ship's speed (m/s)
ASV=1.5                 #Speed of sound in water (m/s)
SPI=6.25                #Distance between sample stations (m)
SB=0-((Dep*2)/ASV)      #Sound travel time to seabed (milliseconds) - negative to denote below time zero
IET=(SPI/Speed)         #Inter Event Time (s) time to travel SPI

Rmin=0
Rmax=-2000


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

app = JupyterDash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div([
#     dcc.Graph(id='graph-with-slider'),
    dcc.Slider(
        id='3DHR Slider',
        min=Rmax,
        max=Rmin,
        value=(Rmax-Rmin)/2,
        marks={i: f"DHR {i}" for i in range(-20000,0, 200)},
        step=50
    ),
    html.Div(id="sliderVal")
])

@app.callback(
    Output("sliderVal", "children"),
    Input('3DHR Slider', "value")
)
def useSlider(dhrSlider):
    return dhrSlider

app.run_server(mode="inline")
 

Комментарии:

1. У меня не установлен Jupyter_Dash (возможно, мне следует), но я перенес соответствующую часть «метки» в свою, и теперь я получаю более или менее то, что хотел — я, безусловно, получаю отметки каждые 200 и шаги каждые 50. Каждая метка помечена DHR1, есть ли способ пометить их соответствующим номером, например -2000, -1800 и т.д.?

2.простой случай настройки строки f f"DHR {I}" . в вашем образце кода он был обозначен как метка n