定制渲染器#

渲染器,如Altair 的渲染器框架中所介绍的,是一个函数,它接受 Vega-Lite 或 Vega 可视化规范(作为 Python dict),并返回符合 Jupyter MIME Bundle 格式的 Python dict。这个字典将由图表的 _repr_mimebundle_ 方法返回。

MIME bundle 的键应该是 MIME 类型(例如 image/png),值应该是该 MIME 类型的数据(文本、base64 编码的二进制或 JSON)。Altair 的默认 html 渲染器使用 "text/html" MIME 类型返回跨平台的 HTML 表示;其示意图如下所示

def default_renderer(spec):
    bundle = {'text/html': generate_html(spec)}
    metadata = {}
    return bundle, metadata

如果渲染器需要执行不使用前端显示系统的定制显示逻辑,它也可以返回一个空的 MIME bundle 字典。

def empty_bundle_renderer(spec):
    # Custom display logic that uses the spec
    ...
    # Return empty MIME bundle
    return {}

作为一个定制渲染器的简单示例,假设我们想添加一个 plaintext 渲染器,它以纯文本形式渲染图表描述。我们可以这样做

def plaintext_mimetype(spec):
    return {'text/plain': "description: " + spec.get('description', 'none')}

alt.renderers.register('plaintext', plaintext_mimetype)

alt.renderers 注册表允许用户定义和启用新的渲染器。现在你可以启用这个 MIME 类型,然后当你的图表显示时,你将看到这个描述

alt.renderers.enable('plaintext')

alt.Chart('data.txt').mark_point().encode(
    x='x:Q',
    y='y:Q'
).properties(
    description='This is a simple chart'
)
description: This is a simple chart

这是一个简单的例子,但它展示了这种方法的灵活性。如果你有一个前端能够识别 _repr_mimebundle_ 作为获取 Python 对象 MIME 类型表示的方式,那么你可以定义一个函数,在返回任何 MIME 类型之前以任何方式处理图表内容。