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

标签 python altair

我正在尝试使用 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

bar chart in wrong order

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

最佳答案

Vega-Lite 不支持联合域排序。如果您打开图表的 javascript 控制台,或者如果您view it in the vega editor ,您将看到 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

enter image description here

关于python - 为什么创建分层条形图会删除排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58208319/

相关文章:

python - 显示时间进度

python - 在 Altair 中的绘图上重叠垂直线

python - 使用 altair 将身份线添加到散点图

python - 在 Altair 中过滤到状态级别的 Choropleth map

python - 从 pony ORM 创建 postgres 数据库

python - 使用 pyparsing 从 ovs 转储流中提取数据

python - python 中不需要的列表分配行为

python - 如何计算标签/工具提示的聚合的聚合?

python - 无法在 folium map 中将 altair 可视化作为弹出窗口插入

python - 计算列表内部列表的长度