Почему создание многослойной гистограммы удаляет сортировку? - PullRequest
2 голосов
/ 02 октября 2019

Я пытаюсь использовать Альтаир для создания столбчатой ​​диаграммы с накоплением. Я хотел бы пометить каждый столбец с процентами от общего количества всех столбцов в порядке убывания. Вот как я создаю два слоя (один для столбцов, один для надписей):

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

Как сохранить сортировку баров, когдаобъединение слоев?

1 Ответ

2 голосов
/ 02 октября 2019

Сортировка объединенных доменов не поддерживается в 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-Легкая ошибка здесь: 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

...