Estoy tratando de ordenar el eje de mi gráfico según los valores en la columna "ventas". Una vez que aplico fig.update_layout(yaxis={'categoryorder':'total descendente'}) a mi figura, el gráfico ya no elimina filas irrelevantes al filtrar el marco de datos seleccionando el valor "099" para la opción de devolución de llamada RadioItems.
código para recrear el problema:
import pandas as pd from plotly import tools import plotly.express as px import plotly.graph_objects as go import dash import dash_core_components as dcc import dash_html_components as html from jupyter_dash import JupyterDash import dash_bootstrap_components as dbc from dash.dependencies import Input, Output data = {'name': {0: 'G P', 1: 'D L', 2: 'T B', 3: 'N A', 4: 'P O', 5: 'Ho A'}, 'team': {0: '099', 1: '099', 2: '073', 3: '073', 4: '073', 5: '099'}, 'sales': {0: 88946, 1: 8123, 2: 6911, 3: 74796, 4: 8532, 5: -31289} } df1 = pd.DataFrame.from_dict(data) app = JupyterDash(external_stylesheets=[dbc.themes.SLATE]) template = 'plotly_dark' controls = dbc.Card( [ dbc.FormGroup( [ dbc.Label("Teams"), dcc.RadioItems( id='slm-radio', options=[{'label': 'All', 'value': 'All'}] + [{'label': k, 'value': k} for k in df1['team'].unique()], value='All', ), ], ) ] ) app.layout = dbc.Container( [ dbc.Row([ dbc.Col([controls],xs = 4), dbc.Col([ dbc.Row([ dbc.Col(dcc.Graph(id="sales_graph")), ]) ]), ]), html.Br(), ], fluid=True, ) @app.callback( Output("sales_graph", "figure"), [ Input("slm-radio", "value") ], ) def history_graph(team): dataset = df1 if not team == 'All': dataset = dataset[dataset['team']==team] else: dataset = dataset v_cat = dataset['name'] x_val = dataset['sales'] fig = go.Figure(go.Bar( x=x_val, y=v_cat, marker_color="#ff0000", orientation='h', width=0.25 )) fig.update_layout(template='plotly_dark') fig.update_layout(yaxis={'categoryorder':'total descending'}) return fig app.run_server(mode='inline', port = 8009)El resultado deseado es eliminar las columnas NA, PO y TB cuando se selecciona '099'
Obtengo los resultados deseados si:
Pude solucionar este problema calculando la clasificación independientemente del paso de la gráfica y colocando las clasificaciones en una serie, rankings . Luego pasé la serie clasificada a
fig.update_layout(yaxis={'categoryorder':'array', 'categoryarray':rankings['team_rank']})