Точки категориальных данных не отображаются на точечной диаграмме при использовании раскрывающегося списка множественного выбора. - PullRequest
0 голосов
/ 04 мая 2020

Предположим, что у нас есть следующий фрейм данных, извлеченный из SQL с именем df:

ProdHouse   Date_Year   Date_Month
Software6   2001    Jan
Software6   2020    Feb
Software1   2004    Mar
Software4   2004    Apr
Software5   2004    May
Software3   2009    Dec
Software5   1995    Dec
Software3   1995    Oct

Цель - показать общее количество продуктов в месяц. Год выбирается с помощью выпадающего списка. Похоже, что, когда ось X является категориальной (то есть месяц), она не отображает точки данных. Однако, если я подставлю его в целое число, отобразятся точки.

def serve_layout():
        session_id = str(uuid.uuid4())

    return   html.Div([ html.Div(session_id, id='session-id', style={'display': 'none'}),
    html.Label('Year'),
    dcc.Dropdown( id='year-dropdown',
        options=[
                   {'label': year ,'value': year} for year in df['Date_Year'].unique()
        ],
        value=[2020],#[df['Date_Year'].unique()],
        multi=True   ),
    dcc.Graph(id='graph-with-dropdown')      
    ] , style={'width':'33%','display':'inline-block'}  )



app.layout = serve_layout


@app.callback(
    dash.dependencies.Output('graph-with-dropdown', 'figure'),
    [dash.dependencies.Input('year-dropdown', 'value')]) # Add the marks as a State
def update_figure(selected_year):
    print('selected_year:   ', selected_year)
    filtered_df = df[df.Date_Year.isin(selected_year)]
    #filtered_df = df[df.Date_Year == selected_year]
    df_grouped =  filtered_df.groupby(['ProdHouse','Date_Month']).size().rename('Total_Active_Products').reset_index()
    traces=[]

    for i in filtered_df.ProdHouse.unique():        
        df_by_ProdHouse = df_grouped[df_grouped['ProdHouse'] == i]
        traces.append(go.Scatter(
            x=df_by_ProdHouse['Date_Month'], #df_by_ProdHouse['Total_Active_Products'],
            y=df_by_ProdHouse['Total_Active_Products'],
            ##text=df_by_ProdHouse['brand'],
            mode='markers',
            opacity=0.7,
            marker={
                'size': 15,
                'line': {'width': 0.5, 'color': 'white'}
            },
            name=i
     )    )
    return {
            'data': traces,
            'layout': dict(
            xaxis={'type': 'linear', 'title': 'Active Products Per Month'},
            yaxis={'title': 'Total Active Products'},
            margin={'l': 40, 'b': 40, 't': 10, 'r': 10},
            legend={'x': 0, 'y': 1},
            hovermode='closest',
            transition = {'duration': 500},
    )
}

Results

Как изменить код, указанный выше, чтобы ось х может быть категориальная переменная?

Кроме того, нужно ли использовать групповку для получения итогов? Можно ли это оптимизировать?

1 Ответ

0 голосов
/ 04 мая 2020

Это ответ на первую часть вопроса, которая связана с тем, что точки не отображаются. Мне удается отображать категорические данные, меняя график рассеяния на гистограмму. Поскольку график был изменен, я удалил параметры режима и типа.

@app.callback(
    dash.dependencies.Output('graph-with-dropdown', 'figure'),
    [dash.dependencies.Input('year-dropdown', 'value')]) # Add the marks as a State
def update_figure(selected_year):
    print('selected_year:   ', selected_year)
    filtered_df = df[df.Date_Year.isin(selected_year)]
    df_grouped =  filtered_df.groupby(['ProdHouse','Date_Month']).size().rename('Total_Active_Products').reset_index()
    traces=[]

    for i in filtered_df.ProdHouse.unique():        
        df_by_ProdHouse = df_grouped[df_grouped['ProdHouse'] == i]
        traces.append(go.Bar(
            x=df_by_ProdHouse['Date_Month'],
            y=df_by_ProdHouse['Total_Active_Products'],

            name=i
     )    )
    return {
            'data': traces,
            'layout': dict(
            xaxis={ 'title': 'Active Products Per Month'},
            yaxis={'title': 'Total Active Products'},
            margin={'l': 40, 'b': 40, 't': 10, 'r': 10},
            legend={'x': 0, 'y': 1},
            hovermode='closest',
            transition = {'duration': 500},
    )
}

Results

...