|
import os |
|
from typing import Dict |
|
|
|
from ...utils.mimebundle import spec_to_mimebundle |
|
from ..display import ( |
|
Displayable, |
|
default_renderer_base, |
|
json_renderer_base, |
|
RendererRegistry, |
|
HTMLRenderer, |
|
DefaultRendererReturnType, |
|
) |
|
|
|
from .schema import SCHEMA_VERSION |
|
|
|
from typing import Final |
|
|
|
VEGALITE_VERSION: Final = SCHEMA_VERSION.lstrip("v") |
|
VEGA_VERSION: Final = "5" |
|
VEGAEMBED_VERSION: Final = "6" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VEGALITE_MIME_TYPE: Final = "application/vnd.vegalite.v5+json" |
|
|
|
|
|
VEGA_MIME_TYPE: Final = "application/vnd.vega.v5+json" |
|
|
|
|
|
|
|
|
|
ENTRY_POINT_GROUP: Final = "altair.vegalite.v5.renderer" |
|
|
|
|
|
DEFAULT_DISPLAY: Final = f"""\ |
|
<VegaLite {VEGALITE_VERSION.split('.')[0]} object> |
|
|
|
If you see this message, it means the renderer has not been properly enabled |
|
for the frontend that you are using. For more information, see |
|
https://altair-viz.github.io/user_guide/display_frontends.html#troubleshooting |
|
""" |
|
|
|
renderers = RendererRegistry(entry_point_group=ENTRY_POINT_GROUP) |
|
|
|
here = os.path.dirname(os.path.realpath(__file__)) |
|
|
|
|
|
def mimetype_renderer(spec: dict, **metadata) -> DefaultRendererReturnType: |
|
return default_renderer_base(spec, VEGALITE_MIME_TYPE, DEFAULT_DISPLAY, **metadata) |
|
|
|
|
|
def json_renderer(spec: dict, **metadata) -> DefaultRendererReturnType: |
|
return json_renderer_base(spec, DEFAULT_DISPLAY, **metadata) |
|
|
|
|
|
def png_renderer(spec: dict, **metadata) -> Dict[str, bytes]: |
|
return spec_to_mimebundle( |
|
spec, |
|
format="png", |
|
mode="vega-lite", |
|
vega_version=VEGA_VERSION, |
|
vegaembed_version=VEGAEMBED_VERSION, |
|
vegalite_version=VEGALITE_VERSION, |
|
**metadata, |
|
) |
|
|
|
|
|
def svg_renderer(spec: dict, **metadata) -> Dict[str, str]: |
|
return spec_to_mimebundle( |
|
spec, |
|
format="svg", |
|
mode="vega-lite", |
|
vega_version=VEGA_VERSION, |
|
vegaembed_version=VEGAEMBED_VERSION, |
|
vegalite_version=VEGALITE_VERSION, |
|
**metadata, |
|
) |
|
|
|
|
|
html_renderer = HTMLRenderer( |
|
mode="vega-lite", |
|
template="universal", |
|
vega_version=VEGA_VERSION, |
|
vegaembed_version=VEGAEMBED_VERSION, |
|
vegalite_version=VEGALITE_VERSION, |
|
) |
|
|
|
renderers.register("default", html_renderer) |
|
renderers.register("html", html_renderer) |
|
renderers.register("colab", html_renderer) |
|
renderers.register("kaggle", html_renderer) |
|
renderers.register("zeppelin", html_renderer) |
|
renderers.register("mimetype", mimetype_renderer) |
|
renderers.register("jupyterlab", mimetype_renderer) |
|
renderers.register("nteract", mimetype_renderer) |
|
renderers.register("json", json_renderer) |
|
renderers.register("png", png_renderer) |
|
renderers.register("svg", svg_renderer) |
|
renderers.enable("default") |
|
|
|
|
|
class VegaLite(Displayable): |
|
"""An IPython/Jupyter display class for rendering VegaLite 5.""" |
|
|
|
renderers = renderers |
|
schema_path = (__name__, "schema/vega-lite-schema.json") |
|
|
|
|
|
def vegalite(spec: dict, validate: bool = True) -> None: |
|
"""Render and optionally validate a VegaLite 5 spec. |
|
|
|
This will use the currently enabled renderer to render the spec. |
|
|
|
Parameters |
|
========== |
|
spec: dict |
|
A fully compliant VegaLite 5 spec, with the data portion fully processed. |
|
validate: bool |
|
Should the spec be validated against the VegaLite 5 schema? |
|
""" |
|
from IPython.display import display |
|
|
|
display(VegaLite(spec, validate=validate)) |
|
|