Search code examples
pythonaltair

how to arbitrarily sort the radial plot values in altair?


I'm building a radial chart in python but can't order the values of the plot based on the 'categoria' values. I already tried to sort the df and force through domain and sort in the altair code but can't get the desired result. What I'm doing wrong?

radial plot

Here's a sample of my current dataframe:

index da_tipo_servicio_salud categoria porcentaje rubro
57 En ambos, público y privado Menos de $200 pesos 44.44444444444444 Transporte
36 En ambos, público y privado Menos de $200 pesos 7.142857142857142 Medicamentos
15 En ambos, público y privado Menos de $200 pesos 3.571428571428571 Citas médicas
48 En ambos, público y privado Entre $200 y $500 pesos 29.629629629629626 Transporte

and the altair code I'm using:


orden_monto = ['Menos de $200 pesos', 'Entre $200 y $500 pesos', 'Entre $500 y $800 pesos', 'Entre $800 y $1,000 pesos', 'Entre $1,000 y $1,500 pesos', 'Entre $1,500 y $2,000 pesos', 'Más de $2,000 pesos']

base = alt.Chart(df_combinado_orden_ambos).transform_filter(
    alt.datum.rubro == 'Medicamentos'
).encode(
    theta=alt.Theta(field='porcentaje', type='quantitative', stack=True),
    radius=alt.Radius(field='porcentaje', type='quantitative', scale=alt.Scale(type='sqrt', zero=True, rangeMin=100)),
    color=alt.Color('categoria:N', scale=alt.Scale(scheme='blues', domain=orden_monto), sort=orden_monto) 
).properties(
    title={
        'text': ['Distribución porcentual por categoría'],
        'subtitle': ['Medicamentos'],
        'anchor': 'start',
        'offset': 20
    }
)

c1 = base.mark_arc(innerRadius=20, cornerRadius=5, stroke="#fff")
c2 = base.mark_text(radiusOffset=25).encode(text=alt.Text('porcentaje:Q', format='.0f'))

final_chart = c1 + c2
final_chart.display()


Solution

  • Try using the order encoding and set order='categoria'.