Сохранение определенного порядка / сортировки по оси Y в Altair для слоистых графиков - PullRequest
0 голосов
/ 05 января 2019

Я хотел бы построить график Треллиса, показанный в документации Altair здесь: https://altair -viz.github.io / gallery / beckers_barley_trellis_plot.html .

В коде, показанном ниже, я создаю диаграмму "mark_rule" с определенной сортировкой по оси Y и накладываю ее на "mark_point", чтобы выделить конечные точки. Однако, когда я добавляю слой «mark_point» поверх «mark_rule», сортировка / порядок по оси Y теряется; и я не могу пересортировать / переупорядочить ось Y многослойной диаграммы. Пожалуйста, смотрите ниже график "mark_rule", который имеет правильную сортировку по оси Y и график "mark_rule + park_point", где сортировка по оси Y потеряна после наложения. Мне было интересно, как мы можем повторно покрыть вид оси Y после наслоения. Добавление окончательного «кодирования» для сортировки по оси Y, похоже, не помогает.

combined = alt.layer(rule, point_a, point_b).encode(alt.Y('key:N', axis=alt.Axis(title='', grid=True),sort=alt.EncodingSortField(field='item_b', op='max', order='descending')))

Ниже приведен воспроизводимый код для прикрепленных изображений:

df = pd.DataFrame(
[
    {
        'key': 'US',
        'item_a': 1.14,
        'item_b': 1.43
    },
    {
        'key': 'IN',
        'item_a': 0.78,
        'item_b': 0.88
    },
    {
        'key': 'CN',
        'item_a': 0.38,
        'item_b': 0.44
    },
    {
        'key': 'AE',
        'item_a': 0.19,
        'item_b': 0.22
    },    
    {
        'key': 'MX',
        'item_a': 0.95,
        'item_b': 0.99
    },  
    {
        'key': 'RU',
        'item_a': 0.57,
        'item_b': 0.63
    }, 
    {
        'key': 'SA',
        'item_a': 0.52,
        'item_b': 0.49
    },     
    {
        'key': 'TR',
        'item_a': 0.29,
        'item_b': 0.34
    },      
]
)

base = alt.Chart(data=df, title='').encode(
    alt.Y('key:N', axis=alt.Axis(title='', grid=True),sort=alt.EncodingSortField(field='item_b', op='max', order='descending'))
)
rule = base.mark_rule(color='gray').encode(
    alt.X('item_a:Q', axis=alt.Axis(grid=False, title="Value")),
    alt.X2('item_b'),    
)
# rule.save('Just_rule.png', scale_factor=2)
point_a = base.mark_point(color='red', size=80).encode(alt.X('item_a'))
point_b = base.mark_point(color='steelblue', size=80).encode(alt.X('item_b'))
# combined.save('Combined.png', scale_factor=2)

mark_rule с правильным порядком оси Y

mark_rule + mark_point с потерянным порядком оси Y

1 Ответ

0 голосов
/ 07 января 2019

Это известная ошибка в сортировке + наслоении в Altair / Vega-Lite. В Vega-Lite это исправлено (см. vega-lite # 2177 ), поэтому ваш код должен работать правильно после выпуска Altair 3.0. В то же время, вы можете использовать обходной путь, упомянутый здесь .

...