You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Altair中自定义径向图的分类排序?

解决Altair径向图按categoria字段排序无效的问题

问题背景

在Python中使用Altair构建径向图时,无法按categoria字段的自定义顺序排列图表元素。已尝试对DataFrame排序,并在Color编码中设置domain和sort参数,但未达到预期效果。

数据样例

indexda_tipo_servicio_saludcategoriaporcentajerubro
57En ambos, público y privadoMenos de $200 pesos44.44444444444444Transporte
36En ambos, público y privadoMenos de $200 pesos7.142857142857142Medicamentos
15En ambos, público y privadoMenos de $200 pesos3.571428571428571Citas médicas
48En ambos, público y privadoEntre $200 y $500 pesos29.629629629629626Transporte

原代码

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()

错误原因

你仅在Color编码中设置了sort参数,但该参数仅控制图例的顺序,不会影响径向图中弧的堆叠/排列顺序。当Theta编码使用stack=True时,图表元素的排列顺序由order编码或分组字段的排序规则决定,而非颜色编码的设置。

修正方案

在encode中添加order编码,明确指定按categoria字段的自定义顺序排列:

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),
    # 新增order编码,指定堆叠顺序与自定义列表一致
    order=alt.Order('categoria:N', 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()

添加order编码后,径向图的弧会严格按照orden_monto列表的顺序排列,同时保留图例的排序效果。

内容的提问来源于stack exchange,提问作者Jay Ballesteros C.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:43:13