如何在Altair中自定义径向图的分类排序?
解决Altair径向图按
categoria字段排序无效的问题 问题背景
在Python中使用Altair构建径向图时,无法按categoria字段的自定义顺序排列图表元素。已尝试对DataFrame排序,并在Color编码中设置domain和sort参数,但未达到预期效果。
数据样例
| 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 |
原代码
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.
相关产品推荐
相关产品推荐

