Альтаир: Как добавлять метки к гистограммам, имеющим строки

При попытке добавить метки к гистограмме Альтаира, содержащей строки, я получаю SchemaValidationError. Я говорю о таких ярлыках, как здесь: https://altair-viz.github.io/gallery/bar_chart_with_labels.html

И я говорю о столбчатых диаграммах со строками или «горизонтальных сгруппированных столбчатых диаграммах» вроде этого: https://altair-viz.github.io/gallery/grouped_bar_chart_horizontal.html

Вот код, который НЕ работает:

from vega_datasets import data

source = data.barley()

bars = alt.Chart(source).mark_bar().encode(
    x='sum(yield):Q',
    y='year:O',
    row='variety:N',
)
bars

text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3  # Nudges text to right so it doesn't appear on top of the bar
).encode(
    text='sum(yield):Q'
)

bars + text

Если я удалю параметр строки на гистограмме, он будет работать должным образом:

bars = alt.Chart(source).mark_bar().encode(
    x='sum(yield):Q',
    y='year:O'
)
bars

text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3  # Nudges text to right so it doesn't appear on top of the bar
).encode(
    text='sum(yield):Q'
)

bars + text

Добавление строк в метод mark_text тоже не помогает ...

В конце концов, я хотел бы видеть ярлыки справа от своих столбцов, как показано здесь: https://imgur.com/KFJtNkb


person the_economist    schedule 22.07.2019    source источник


Ответы (1)


Ошибка из вашего фрагмента кода:

ValueError: Faceted charts cannot be layered.

В общем, нет никакой гарантии, что у двух фасетных диаграмм будут совпадающие фасеты, которые можно наслоить, поэтому Vega-Lite не допускает наслоение фасетных диаграмм.

Способ обойти это - фасетировать многослойную диаграмму, а не накладывать фасетную диаграмму. Например:

import altair as alt
from vega_datasets import data

source = data.barley()

bars = alt.Chart(source).mark_bar().encode(
    x='sum(yield):Q',
    y='year:O',
)
bars

text = bars.mark_text(
    align='left',
    baseline='middle',
    dx=3  # Nudges text to right so it doesn't appear on top of the bar
).encode(
    text='sum(yield):Q'
)

(bars + text).facet(row='variety:N')

введите здесь описание изображения

person jakevdp    schedule 22.07.2019
comment
Извини, я был слишком быстр. Ваш код не работает :(. Я по-прежнему получаю ту же ошибку, о которой уже сообщал. - person the_economist; 24.07.2019
comment
Убедитесь, что вы используете Altair версии 3.1 или новее. В более старых версиях данные нужно указывать по-другому. - person jakevdp; 24.07.2019
comment
Если по какой-то причине вы не можете использовать последнюю версию Altair, удалите source как аргумент alt.Chart() и вместо этого поместите его как аргумент фасета: facet(row='variety:N', data=source). - person jakevdp; 24.07.2019
comment
Спасибо за подсказку! Используя altair 3.1 работает :) - person the_economist; 25.07.2019
comment
Если бы вы хотели отсортировать приведенную выше диаграмму по сумме урожайности за 1931 г., чтобы порядок строк был следующим: Треби, Висконсин, № 38, № 457, как бы вы это сделали? - person MVigoda; 17.05.2020