¿Cómo actualizar los ejes cuando el valor en el menú desplegable cambia con go.Bar() (trama)?
Intento actualizar xaxis_title_text
(update_layout) y tickvals
( ticktext
update_xaxes) cuando cambia el valor del menú desplegable. Intenté adaptar los ejemplos de Plotly ( enlace ) y esta respuesta , pero estoy atascado con las actualizaciones de los ejes. En las Figuras 1 y 2, podemos ver de la Figura 1 a la Figura 2 que los ejes no se actualizan cuando cambia el menú desplegable. Tkx por la ayuda con eso.
Figura 1
Figura 2
CÓDIGO :
import pandas as pd
import numpy as np
import plotly.graph_objects as go
### My df has more than 1,5M rows with 79 columns. Each column may vary the scale of the number.
### E.g.: Age, weight, income, etc aren't normalized.
df = pd.DataFrame() # any dataframe to compute a histogram
num_cols = df.columns
def compute_bins(x, bins, return_var):
hist, bins_edges = np.histogram(x, bins=bins)
bins_text = [f"({np.round(bins_edges[i],2)}, {np.round(bins_edges[i+1],2)}]" for i in range(len(bins_edges)-1) ]
if return_var == 'h':
return hist
else:
return bins_text
hist = compute_bins(x=df[x_title].values, bins=10, return_var='h')
hist = compute_bins(x=df[x_title].values, bins=10, return_var='b')
fig = go.Figure(go.Bar(x=np.array(range(len(bins_text))), y=hist))
my_buttons = [dict(
mehotd='update',
args=[{"y": [ compute_bins(x=df[x_title].values, bins=10, return_var='h'), 'underfined' ]
"x": [ compute_bins(x=df[x_title].values, bins=10, return_var='h'), 'underfined' ]}
],
label = c
) for k, c in enumerate(num_cols)]
fig.update_axes(tickvals==np.array(range(len(bins_text))), ticktext=bins_text)
fig.update_layout(bargap=0, xaxis_title_text=x_title, yaxis_title_text='Count',
updatemenus=[dict(
active=0,
x=0,y=1.2,
xanchor='left',
yanchor='top',
buttons=my_buttons
)]
)
Aceptado
Como valores de entrada para el menú desplegable, se requieren configuraciones relacionadas con fig.data y fig.layout. Modifiqué su código usando datos de muestra de iris ya que no presentó ningún dato.
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
df = px.data.tips()
num_cols = df.columns[:2]
x_title = 'total_bill'
def compute_bins(x, bins, return_var):
hist, bins_edges = np.histogram(x, bins=bins)
bins_text = [f"({np.round(bins_edges[i],2)}, {np.round(bins_edges[i+1],2)}]" for i in range(len(bins_edges)-1) ]
if return_var == 'h':
return hist
else:
return bins_text
hist = compute_bins(x=df[x_title].values, bins=10, return_var='h')
bins_text = compute_bins(x=df[x_title].values, bins=10, return_var='b')
fig = go.Figure(go.Bar(x=bins_text, y=hist))
my_buttons = [dict(
method='update',
args=[{"y": [compute_bins(x=df[c].values, bins=10, return_var='h')],
"x": [compute_bins(x=df[c].values, bins=10, return_var='b')]},
{'xaxis': {'ticktext':[compute_bins(x=df[c].values, bins=10, return_var='b')],
'title': c}}
],
label = c
) for k, c in enumerate(num_cols)]
fig.update_xaxes(tickvals=np.array(range(len(bins_text))), ticktext=bins_text)
fig.update_layout(bargap=0, xaxis_title_text=x_title, yaxis_title_text='Count',
updatemenus=[dict(
active=0,
x=0,y=1.2,
xanchor='left',
yanchor='top',
buttons=my_buttons
)]
)
fig.show()