3

情况似乎很简单:我正在使用带有多个 Altair 绘图的 Jupyter Lab 文件,这最终使文件太大而无法运行和保存。由于我不需要每次都查看这些图,我想我可以通过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')用作减小文件大小的一种方式,但它也不起作用,但请不要关注这个,而是关注更简单的问题。

4

1 回答 1

6

简短的回答:使用chart.display()

长答案:一般来说,Jupyter 笔记本只有在您告诉它们时才会显示内容。例如,此代码不会产生任何输出:

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()多个图表是您可以在单个单元格中显示多个图表的方式。

于 2018-07-26T16:22:23.757 回答