Можно ли отсортировать столбцы сгруппированной гистограммы Altair по значению одной из категорий? - PullRequest
1 голос
/ 11 апреля 2020

У меня есть следующий график -
enter image description here
Я хотел бы иметь возможность сортировать столбцы (НЕ отдельные столбцы одной группы - я знаю, как это сделать это уже), то есть закажите 3 вложенную диаграмму - если хотите - на основе значения любой категории (a, b или c), которую я выберу.

Я пытался использовать alt.SortField и alt.EncodeSortField, они немного перемещаются по графикам, но на самом деле не работают, если вы измените категорию, чтобы посмотреть, действительно ли они работают.

Код -

import altair as alt
import pandas as pd

dummy = pd.DataFrame({'place':['Asia', 'Antarctica','Africa', 'Antarctica', 'Asia', 'Africa', 'Africa','Antarctica', 'Asia'],'category':['a','a','a','b','b','b','c','c','c'],'value':[5,2,3,4,3,5,6,9,5]})
alt.Chart(dummy).mark_bar().encode(
    x=alt.X('category'),
    y='value',
    column=alt.Column('place:N', sort=alt.SortField(field='value', order='descending')),
    color='category',
)

Я знаю, что alt.Column('place:N', sort=alt.SortField(field='value', order='descending')), не кажется правильным, так как я не нацеливаюсь на какую-либо категорию, поэтому я тоже попробовал x=alt.X('category', sort=alt.SortField(field='c', order='descending')),, но он тоже не работает.

Ожидаемый результат (в порядке убывания) -

  • Если я хочу упорядочить по 'c', то сначала следует средний столбец, затем левый и, наконец, правый столбец.
  • Кажется, он уже упорядочен по 'b'.
  • Если я хочу упорядочить по 'a', то правый столбец должен быть первым, за которым следуют левый и, наконец, средний столбец.

1 Ответ

0 голосов
/ 11 апреля 2020

Это немного сложно, но вы можете сделать это с помощью серии преобразований:

Похоже, сначала сортировка по "c":

import altair as alt
import pandas as pd

dummy = pd.DataFrame({'place':['Asia', 'Antarctica','Africa', 'Antarctica', 'Asia', 'Africa', 'Africa','Antarctica', 'Asia'],'category':['a','a','a','b','b','b','c','c','c'],'value':[5,2,3,4,3,5,6,9,5]})
alt.Chart(dummy).transform_calculate(
    key="datum.category == 'c'"
).transform_joinaggregate(
    sort_key="argmax(key)", groupby=['place']
).transform_calculate(
    sort_val='datum.sort_key.value'  
).mark_bar().encode(
    x=alt.X('category'),
    y='value',
    column=alt.Column('place:N', sort=alt.SortField("sort_val", order="descending")),
    color='category',
)

enter image description here

Затем сортировка по "a":

alt.Chart(dummy).transform_calculate(
    key="datum.category == 'a'"
).transform_joinaggregate(
    sort_key="argmax(key)", groupby=['place']
).transform_calculate(
    sort_val='datum.sort_key.value'  
).mark_bar().encode(
    x=alt.X('category'),
    y='value',
    column=alt.Column('place:N', sort=alt.SortField("sort_val", order="descending")),
    color='category',
)

enter image description here

...