Skip to content

Error calling chart.save when using __dataframe__ protocol #3109

Closed
@jcrist

Description

@jcrist

I'm trying out altair's support for the new __dataframe__ protocol, and am running into a few issues.

Given the following pyarrow & altair code (taken and modified from the getting started guide):

import altair as alt
import pyarrow as pa

data = pa.Table.from_pydict(
    {'x': ['A', 'B', 'C', 'D', 'E'],
     'y': [5, 3, 6, 7, 2]}
)

chart = alt.Chart(data).mark_bar().encode(
    x='x',
    y='y',
)
chart.save("out.html")

This outputs:

Traceback (most recent call last):
  File "/home/jcristharif/Code/altair/test.py", line 13, in <module>
    chart.save("out.html")
  File "/home/jcristharif/Code/altair/altair/vegalite/v5/api.py", line 1066, in save
    result = save(**kwds)
             ^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/save.py", line 189, in save
    perform_save()
  File "/home/jcristharif/Code/altair/altair/utils/save.py", line 127, in perform_save
    spec = chart.to_dict(context={"pre_transform": False})
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/vegalite/v5/api.py", line 2677, in to_dict
    return super().to_dict(
           ^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/vegalite/v5/api.py", line 903, in to_dict
    vegalite_spec = super(TopLevelMixin, copy).to_dict(  # type: ignore[misc]
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/schemapi.py", line 807, in to_dict
    result = _todict(
             ^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/schemapi.py", line 340, in _todict
    return {k: _todict(v, context) for k, v in obj.items() if v is not Undefined}
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/schemapi.py", line 340, in <dictcomp>
    return {k: _todict(v, context) for k, v in obj.items() if v is not Undefined}
               ^^^^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/schemapi.py", line 336, in _todict
    return obj.to_dict(validate=False, context=context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/schemapi.py", line 807, in to_dict
    result = _todict(
             ^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/schemapi.py", line 340, in _todict
    return {k: _todict(v, context) for k, v in obj.items() if v is not Undefined}
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/schemapi.py", line 340, in <dictcomp>
    return {k: _todict(v, context) for k, v in obj.items() if v is not Undefined}
               ^^^^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/utils/schemapi.py", line 336, in _todict
    return obj.to_dict(validate=False, context=context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jcristharif/Code/altair/altair/vegalite/v5/schema/channels.py", line 51, in to_dict
    raise ValueError("{} encoding field is specified without a type; "
ValueError: x encoding field is specified without a type; the type cannot be automatically inferred because the data is not specified as a pandas.DataFrame.

Versions:

  • python 3.11
  • altair dev branch
  • pyarrow 12.0.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions