如何在 IF 语句中绘制牵牛星图?

How to make an altair plot within an IF statement?

情况似乎很简单:我在一个 Jupyter Lab 文件中工作,其中有几个 Altair 图,最终使文件太大而无法 运行 和保存。由于我不需要每次都看到这些图,我想我可以通过在脚本开头指定 plotAltair = True 之类的内容,然后将每个 Altair 图嵌套在 if 语句中来避免这种情况。这听起来很简单,但出于某种原因它似乎不起作用。我错过了一些明显的东西吗? [编辑:原来我是]

例如:

import altair as alt
import os
import pandas as pd
import numpy as np
lengths = np.random.randint(0,100,200)
lengths_list = lengths.tolist()
labels = [str(i) for i in lengths_list]
peak_lengths = pd.DataFrame.from_dict({'coords': labels, 
                                       'lengths': lengths_list},
                                       orient='columns')

什么有效:

alt.Chart(peak_lengths).mark_bar().encode(
    x = alt.X('lengths:Q', bin=True),
    y='count(*):Q'
)

什么不起作用:

plotAltair = True
if plotAltair:
    alt.Chart(peak_lengths).mark_bar().encode(
              x = alt.X('lengths:Q', bin=True),
              y='count(*):Q'
    )

** Obs.: 我已经尝试使用 alt.data_transformers.enable('json') 作为减小文件大小的方法,但它也不起作用,但请不要关注这个,而是关注更简单的问题。

简答:使用chart.display()

长答案:Jupyter Notebook 通常只会在您告诉它们时才会显示内容。例如,此代码不会产生任何输出:

if x:
    x + 1

您是在告诉笔记本计算 x + 1,但不对它做任何事情。您需要做的是告诉笔记本打印结果,或者 隐式 将其作为单元格主块中的最后一行,或者 显式 当语句出现在其他任何地方时要求打印它:

if x:
    print(x + 1)

Altair 图表也类似,它们只是普通的 Python 对象。如果将图表放在单元格的末尾,则隐含地要求显示结果,Jupyter 将像显示任何变量一样显示它。如果您希望它从单元格中的任何其他位置显示,您需要使用 IPython.display.display() 函数明确要求显示它:

from IPython.display import display

if plotChart:
    chart = alt.Chart(data).mark_point().encode(x='x', y='y')
    display(chart)

因为这个额外的导入有点冗长,Altair 提供了一个 .display() 方法作为一个方便的函数来做同样的事情:

if plotChart:
    chart = alt.Chart(data).mark_point().encode(x='x', y='y')
    chart.display()

请注意,在多个图表上调用 .display() 是您可以在单个单元格中显示多个图表的方式。