File size: 3,104 Bytes
2fdce3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import os

from ...utils import PluginRegistry
from ...utils.deprecation import deprecated
from ..display import Displayable
from ..display import default_renderer_base
from ..display import json_renderer_base
from ..display import RendererType
from ..display import HTMLRenderer

from .schema import SCHEMA_VERSION

VEGA_VERSION = SCHEMA_VERSION.lstrip("v")
VEGAEMBED_VERSION = "3"


# ==============================================================================
# Vega 5 renderer logic
# ==============================================================================


# The MIME type for Vega 5 releases.
VEGA_MIME_TYPE = "application/vnd.vega.v5+json"  # type: str

# The entry point group that can be used by other packages to declare other
# renderers that will be auto-detected. Explicit registration is also
# allowed by the PluginRegistery API.
ENTRY_POINT_GROUP = "altair.vega.v5.renderer"  # type: str

# The display message when rendering fails
DEFAULT_DISPLAY = """\
<Vega 5 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/troubleshooting.html
"""

renderers = PluginRegistry[RendererType](entry_point_group=ENTRY_POINT_GROUP)


here = os.path.dirname(os.path.realpath(__file__))


def default_renderer(spec):
    return default_renderer_base(spec, VEGA_MIME_TYPE, DEFAULT_DISPLAY)


def json_renderer(spec):
    return json_renderer_base(spec, DEFAULT_DISPLAY)


colab_renderer = HTMLRenderer(
    mode="vega",
    fullhtml=True,
    requirejs=False,
    output_div="altair-viz",
    vega_version=VEGA_VERSION,
    vegaembed_version=VEGAEMBED_VERSION,
)


kaggle_renderer = HTMLRenderer(
    mode="vega",
    fullhtml=False,
    requirejs=True,
    vega_version=VEGA_VERSION,
    vegaembed_version=VEGAEMBED_VERSION,
)


html_renderer = HTMLRenderer(
    mode="vega",
    template="universal",
    vega_version=VEGA_VERSION,
    vegaembed_version=VEGAEMBED_VERSION,
)


renderers.register("default", default_renderer)
renderers.register("html", html_renderer)
renderers.register("jupyterlab", default_renderer)
renderers.register("nteract", default_renderer)
renderers.register("colab", colab_renderer)
renderers.register("kaggle", kaggle_renderer)
renderers.register("json", json_renderer)
renderers.enable("default")


class Vega(Displayable):
    """An IPython/Jupyter display class for rendering Vega 5."""

    renderers = renderers
    schema_path = (__name__, "schema/vega-schema.json")


@deprecated(
    "Rendering Vega specifications is deprecated and will be removed in Altair 5."
)
def vega(spec, validate=True):
    """Render and optionally validate a Vega 5 spec.

    This will use the currently enabled renderer to render the spec.

    Parameters
    ==========
    spec: dict
        A fully compliant Vega 5 spec, with the data portion fully processed.
    validate: bool
        Should the spec be validated against the Vega 5 schema?
    """
    from IPython.display import display

    display(Vega(spec, validate=validate))