Как наложить слои и текстовые диаграммы таким образом с помощью Vegalite?

Я пытаюсь понять, можно ли здесь сложить две диаграммы вместе, поэтому диаграмма с областями и текстовая диаграмма появляются вместе с vega lite.

Я работаю с altair, который, в свою очередь, генерирует визуализируемые спецификации Vega.

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

https://gist.github.com/mrchrisadams/67debffb4ef163e5e41c14ec634dc0fc

Я опишу основную проблему, в которой, как мне кажется, мне нужна помощь, ниже.

Насколько я понимаю, я могу создать диаграмму из набора данных с помощью altair / vega, а затем описать метку, кодируя различные виды информации в канале.

Итак, для диаграммы с областями я могу сделать следующее:

area_chart=alt.Chart(band_df, width=600, height=400).mark_area().encode(
    alt.X('total_no:Q', stack='center', title='Number of transactions in each band'),
    alt.Y('bands:N', title='Spend bands', sort=alt.EncodingSortField(
            field="avg_value",
            op="sum", 
            order="descending" )),
    alt.Color('year(date):O', scale=alt.Scale(
            range=[ '#6CC6BC', '#49B4DF','#36508B', '#000033'])),
    alt.Column('year(date):O', title='Date')
)

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

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

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

---------------------------------------------------------------------------
SchemaValidationError                     Traceback (most recent call last)
~/.virtualenvs/my-project-UP1n69pC/lib/python3.6/site-packages/altair/vegalite/v2/api.py in to_dict(self, *args, **kwargs)

    419         if dct is None:
    420             kwargs['validate'] = 'deep'
--> 421             dct = super(TopLevelMixin, copy).to_dict(*args, **kwargs)
    422 
    423         # TODO: following entries are added after validation. Should they be validated?

~/.virtualenvs/my-project-UP1n69pC/lib/python3.6/site-packages/altair/utils/schemapi.py in to_dict(self, validate, ignore, context)

    252                 self.validate(result)
    253             except jsonschema.ValidationError as err:
--> 254                 raise SchemaValidationError(self, err)
    255         return result
    256 

SchemaValidationError: Invalid specification

        altair.vegalite.v2.api.LayerChart->layer->items, validating 'anyOf'

{'data': {'name': 'data-8f569c8f407b14d634bf02141db458f8'}, 'mark': 'area', 'encoding': {'color': {'type': 'ordinal', 'field': 'date', 'scale': {'range': ['#6CC6BC', '#49B4DF', '#36508B', '#000033']}, 'timeUnit': 'year'}, 'column': {'type': 'ordinal', 'field': 'date', 'timeUnit': 'year', 'title': 'Date'}, 'x': {'type': 'quantitative', 'field': 'total_no', 'stack': 'center', 'title': 'Number of transactions in each band'}, 'y': {'type': 'nominal', 'field': 'bands', 'sort': {'op': 'sum', 'field': 'avg_value', 'order': 'descending'}, 'title': 'Spend bands'}}, 'height': 400, 'width': 600} is not valid under any of the given schemas

Что мне нужно сделать, чтобы их объединить?

Вы можете опубликовать vegaspec, перечисленные в gists, в этот рендерер, чтобы узнать, что я собираюсь сделать:

https://vega.github.io/editor/#/custom/vega-lite

Но прямо сейчас, думаю, я озадачился.

Я был бы очень признателен за советы о том, как объединить две диаграммы.


person Chris Adams    schedule 10.05.2019    source источник


Ответы (1)


Проблема в том, что вы не можете наслоить фасетные диаграммы (как правило, нет гарантии, что фасеты будут выровнены). Что вам нужно сделать, так это фасетировать многослойную диаграмму.

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

area_chart = alt.Chart(width=600, height=400).mark_area().encode(
    alt.X('total_no:Q', stack='center', title='Number of transactions in each band'),
    alt.Y('bands:N', title='Spend bands', sort=alt.EncodingSortField(
            field="avg_value",
            op="sum", 
            order="descending" )),
    alt.Color('year(date):O', scale=alt.Scale(
            range=[ '#6CC6BC', '#49B4DF','#36508B', '#000033'])),
)

text_chart = area_chart.mark_text(
    baseline='middle',
    dx=3  # Nudges text to right so it doesn't appear on top of the bar
).encode(
    text='total_no:Q'
)

alt.layer(
    area_chart,
    text_chart
).facet(
    column=alt.Column('year(date):O', title='Date'),
    data=band_df
)
person jakevdp    schedule 10.05.2019