Как сделать альтаир-сюжет в операторе IF?

Ситуация кажется довольно простой: я работаю в файле Jupyter Lab с несколькими графиками Альтаира, которые в конечном итоге делают файл слишком большим для запуска и сохранения. Поскольку мне не нужно видеть эти графики каждый раз, я решил, что могу избежать этого, указав что-то вроде plotAltair = True в начале сценария, а затем вложив каждый график Альтаира в 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') как способ уменьшения размера файла, но он тоже не работает, но давайте не будем сосредоточиваться на этом, а на более простом вопросе.


person ffi    schedule 26.07.2018    source источник


Ответы (1)


Краткий ответ: используйте chart.display()

Длинный ответ: ноутбуки Jupyter в целом будут отображать вещи, только если вы им скажете. Например, этот код не приведет ни к какому выводу:

if x:
    x + 1

Вы говорите записной книжке оценить x + 1, но ничего не делать с ней. Что вам нужно сделать, так это указать записной книжке напечатать результат, либо неявно, поместив его в качестве последней строки в основном блоке ячейки, либо явно, запросив он будет напечатан, когда оператор появится где-нибудь еще:

if x:
    print(x + 1)

Это похоже на диаграммы Альтаира, которые представляют собой обычные объекты 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() на нескольких диаграммах - это способ отображения нескольких диаграмм в одной ячейке.

person jakevdp    schedule 26.07.2018