在函数内求值时不显示 Altair 图表

Altair chart not displaying when evaluated within a function

以下代码取自 Altair docs,在我的 Jupyter Lab 笔记本中正确显示。

import altair as alt
from vega_datasets import data

source = data.seattle_temps.url

alt.Chart(
    source,
    title="2010 Daily High Temperature (F) in Seattle, WA"
).mark_rect().encode(
    x='date(date):O',
    y='month(date):O',
    color=alt.Color('max(temp):Q', scale=alt.Scale(scheme="inferno")),
    tooltip=[
        alt.Tooltip('monthdate(date):T', title='Date'),
        alt.Tooltip('max(temp):Q', title='Max Temp')
    ]
).properties(width=550)

但是,如果我将确切的代码剪切并粘贴到一个函数中,然后调用该函数,图表将不再显示。

import altair as alt
from vega_datasets import data

def visualize():
    source = data.seattle_temps.url
    alt.Chart(
        source,
        title="2010 Daily High Temperature (F) in Seattle, WA"
    ).mark_rect().encode(
        x='date(date):O',
        y='month(date):O',
        color=alt.Color('max(temp):Q', scale=alt.Scale(scheme="inferno")),
        tooltip=[
            alt.Tooltip('monthdate(date):T', title='Date'),
            alt.Tooltip('max(temp):Q', title='Max Temp')
        ]
    ).properties(width=550)
    
visualize()

我通读了 Altair 的 display troubleshooting 文档,似乎针对此特定问题的最常见解决方法是确保对图表进行评估,在这种情况下就是如此。我不是在写 chart = alt.Chart(...),我是在跳过赋值并直接进行评估,这就是它在函数之外工作的原因。

为什么要为函数费心?我想将它包装在一个函数中的原因是我有一个巨大的数据集(100 GB)存储在数据库中。当我为数据库指定一个过滤器时,结果只有 600 行,因此非常易于管理。我想把它放在 Jupyter Lab 笔记本中,并使过滤器对非技术用户具有交互性,因此我创建了 ipython 小部件来指定过滤器值。当用户在小部件中指定过滤器时,小部件需要一个回调函数来触发从数据库中读取并即时生成视觉效果。

这是因为您的函数没有 returning 任何东西。您正在创建图表,但未 return 对其进行编辑以便 Jupyter Notebook 可以呈现它。如果你写 return alt.Chart(... 它会起作用。如果您不想 return 任何内容,您还可以将 .display() 附加到函数内的图表规范(这也适用于循环显示图表)。