Маркеры одной и той же переменной не были связаны непрерывно на линейном графике рассеяния - PullRequest
2 голосов
/ 04 июля 2019

Я пытаюсь нарисовать линейный график с помощью plotly_graph_objs и dash.

Когда я строю данные и соединяю каждую точку на основе оси X, которая имеет диапазон от 1 до 100, линия не соединяет точки наодин раз.Это означает, что линия просто соединяет некоторые значения xaxis, а другая линия соединяет другие значения.Соединения не были обработаны в порядке возрастания.Один подключил оси 1 и 100, другой подключил 2 к 10 и т. Д.

Я думаю, точка должна быть подключена непрерывно сразу на графике, если они были в одинаковом состоянии.Но я не могу понять это сам ... Как я могу это исправить?

Я уже сделал следующее: 1. отсортировал данные по xaxis, 2. изменил xaxis на числовой,

'' '

df

'''
class_mid   class_sub   class_ssub  yr  a   b   c   d   e
percentile  .   1   2016    319 315 302 301 313
...
percentile  .   100 2016    332 349 337 389 388
percentile  .   100 2017    345 349 351 408 402
percentile  .   100 2018    357 353 356 419 415
percentile  .   100 2019    365 375 369 451 442
decile      .   1   2016    345 349 351 408 402
...
decile      .   10  2019    378 423 502 403 322

'''

' ''

объяснение макета

'''
id: main_graph: dcc.Graph /
id: var:    dcc.Dropdown -> choice one of [a, b, c, d, e] /
id: yr:     dcc.Rangeslider -> min=1998, max=2020 /
id: class_mid:  dcc.Dropdown -> choice percentile or decile
'''

'' '

import datetime
import math
import pandas as pd
from flask import Flask
import dash
from dash.dependencies import Input, Output, State
import dash_core_components as dcc
import dash_html_components as html
import dash_table_experiments as dt
import plotly.graph_objs as go

@app.callback(
    Output('main_graph', 'figure'),
    [Input('var', 'value'),
     Input('yr', 'value'),
     Input('class_mid', 'value')])
def update_main_graph(var, yr_slider, class_mid):

    traces=[]
    for i in range(int(yr_slider[0]), int(yr_slider[1])):
        if var == 'percentile':
            g = df[[var, 'class_mid', 'class_ssub', 'yr']]
            g = g[g['class_mid'].isin(['percentile'])]
            g['class_ssub'] = pd.to_numeric(g['class_ssub'])
            g = g.sort_values(['yr', 'class_ssub'])
            traces.append(
                go.Scatter(
                    x=g[g['class_mid'] == class_mid]['class_ssub'].unique(),
                    y=g[g['yr'] == i][var],
                    mode='lines+markers',
                )
            )

    figure = go.Figure(data = traces)

    return figure

Я ожидаю однолинейный график, когда выбираю год на Rangeslider, но на самом деле это две или более линий.enter image description here

...