为什么创建分层条形图会删除排序?

我正在尝试使用Altair创建堆积条形图。我想用所有条形总数的百分比按降序标记每个条形。以下是我创建两层的方法(一层用于条形,一层用于标签):


import pandas as pd

import altair as alt


df1 = pd.DataFrame({'a': list('AAAABBBB'),

                    'b': list('xxyyxxyy'),

                    'c': [2, 7, 4, 1, 2, 6, 8, 4]})


df2 = df1.groupby('a', as_index=False).sum()

df2['pct'] = (df2['c'] / df2['c'].sum()).round(2)


bars = alt.Chart(df1).mark_bar().encode(

    x=alt.X('c', scale=alt.Scale(domain=[0, 22])),

    y=alt.Y('a', sort=alt.EncodingSortField(field='c', order='descending')),

    color='b',

)

text = alt.Chart(df2).mark_text(dx=15).encode(

    x='c',

    y=alt.Y('a', sort=alt.EncodingSortField(field='c', order='descending')),

    text='c'

)

每一层都按正确的顺序排序,看起来不错。但是当我组合它们时,排序被重置,它们不再按降序排序。


both = bars + text

both

http://img3.mukewang.com/62a7f5d20001260a04760082.jpg

组合图层时如何保持条形排序?



呼如林
浏览 117回答 1
1回答

慕妹3242003

Vega-Lite 不支持对联合域进行排序。如果您打开图表的 javascript 控制台,或者在 vega 编辑器中查看它,您将看到 Vega-Lite 产生的警告:[Warning] Dropping sort property {"field":"c","op":"sum","order":"descending"} as unioned domains only support boolean or op "count".[Warning] Dropping sort property {"field":"c","op":"mean","order":"descending"} as unioned domains only support boolean or op "count".相关的 Vega-Lite 错误在这里:https ://github.com/vega/vega-lite/issues/5048 。如果您从同一数据集构建两个图层,则可以避免这种情况;例如:bars = alt.Chart(df1).mark_bar().encode(    x=alt.X('c:Q', scale=alt.Scale(domain=[0, 22])),    y=alt.Y('a:N', sort=alt.EncodingSortField(field='c', op='sum', order='descending')),    color='b:N',)text = alt.Chart(df1).mark_text(dx=15).encode(    x='sum(c):Q',    y=alt.Y('a:N', sort=alt.EncodingSortField(field='c', op='sum', order='descending')),    text=alt.Text('sum(c):Q'))bars + text
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python