theofred
theofred

Reputation: 77

Sorting faceted layer charts with certain number of columns

This answer shows how to facet layered charts in altiar. In the documentation, the facet() function states to be able to take a facet parameter that can either be a string or an alt.Facet object.

I would like to produce a faceted layered chart, with sorted charts and with columns. My approach was this

import altair as alt
from vega_datasets import data
cars = data.cars()

horse = alt.Chart().mark_point().encode(
    x='Weight_in_lbs',
    y='Horsepower'
)

miles = alt.Chart().mark_point(color='red').encode(
    x='Weight_in_lbs',
    y='Miles_per_Gallon'
)

alt.layer(horse, miles, data=cars).facet(
    # column='Origin'
    facet=alt.Facet('Origin', sort=['USA', 'Europe', 'Japan'], columns=2)
)

Unforunately, it raises this non imformative error

Traceback (most recent call last):
  File ".\test.py", line 19, in <module>
    'test.html', webdriver='firefox', embed_options={'renderer': 'svg'})
  File "<conda-path>\lib\site-packages\altair\vegalite\v4\api.py", line 476, in save
    result = save(**kwds)
  File "<conda-path>\lib\site-packages\altair\utils\save.py", line 79, in save
    spec = chart.to_dict()
  File "<conda-path>\lib\site-packages\altair\vegalite\v4\api.py", line 382, in to_dict
    dct = super(TopLevelMixin, copy).to_dict(*args, **kwargs)
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 328, in to_dict
    context=context,
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 62, in _todict
    for k, v in obj.items()
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 63, in <dictcomp>
    if v is not Undefined
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 56, in _todict
    return obj.to_dict(validate=validate, context=context)
  File "<conda-path>\lib\site-packages\altair\vegalite\v4\api.py", line 382, in to_dict
    dct = super(TopLevelMixin, copy).to_dict(*args, **kwargs)
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 328, in to_dict
    context=context,
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 62, in _todict
    for k, v in obj.items()
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 63, in <dictcomp>
    if v is not Undefined
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 58, in _todict
    return [_todict(v, validate, context) for v in obj]
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 58, in <listcomp>
    return [_todict(v, validate, context) for v in obj]
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 56, in _todict
    return obj.to_dict(validate=validate, context=context)
  File "<conda-path>\lib\site-packages\altair\vegalite\v4\api.py", line 382, in to_dict
    dct = super(TopLevelMixin, copy).to_dict(*args, **kwargs)
  File "<conda-path>\lib\site-packages\altair\utils\schemapi.py", line 339, in to_dict
    raise SchemaValidationError(self, err)
altair.utils.schemapi.SchemaValidationError: Invalid specification

        altair.vegalite.v4.api.Chart, validating 'required'

        'data' is a required property

Without the columns=2 parameter, it works as expected, but has no columns.

Upvotes: 1

Views: 755

Answers (1)

theofred
theofred

Reputation: 77

Moving the column=2 property out of the alt.Facet object seems to do the job.

import altair as alt
from vega_datasets import data
cars = data.cars()

horse = alt.Chart().mark_point().encode(
    x='Weight_in_lbs',
    y='Horsepower'
)

miles = alt.Chart().mark_point(color='red').encode(
    x='Weight_in_lbs',
    y='Miles_per_Gallon'
)

alt.layer(horse, miles, data=cars).facet(
    # column='Origin'
    facet=alt.Facet('Origin', sort=['USA', 'Europe', 'Japan']),
    columns=2
)

Feceted LayerChart with sorted sub-charts in 2 columns

Upvotes: 1

Related Questions