如何在IF语句中绘制高空图?

时间:2018-07-26 13:26:54

标签: python-3.x jupyter altair

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

例如:

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'
    )

**观察员:我已经尝试过使用alt.data_transformers.enable('json')作为减小文件大小的一种方法,并且它也不起作用,但是请不要着重于此,而要关注更简单的问题。

1 个答案:

答案 0 :(得分:2)

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