【问题标题】:Python Altair rendering error - Javascript Error: too much recursionPython Altair 渲染错误 - Javascript 错误:递归过多
【发布时间】:2021-03-24 17:02:12
【问题描述】:

我正在将 Altair 图表用于 Python 和 Jupyter Notebooks,但是如果我增加数据点的数量,其中一个(渲染?)组件会崩溃:

import altair as alt
import datetime
import pandas as pd
import random

def add_minutes(tm, minutes_to_add):
    fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
    fulldate = fulldate + datetime.timedelta(minutes=minutes_to_add)
    return fulldate.time()

time_sort_order = []

render_hours = 13

def build_df():
    value_list = []
    start_time = datetime.time(21, 0, 0)
    for n in range(60*render_hours):
        time_to_fetch = add_minutes(start_time, 1*n)
        time_sort_order.append(str(time_to_fetch))
        value_list.append({
            "time": str(time_to_fetch),
            "value": random.randint(1, 5)
        })
    return pd.DataFrame(value_list)

df = build_df()

alt.Chart(df).mark_rect().encode(
    x=alt.X('time', sort=time_sort_order),
    color='value:Q'
)

如果我设置render_hours = 13: 一切正常/渲染正常

如果我设置render_hours = 14: 我得到一个空白输出

如果我设置render_hours = 24:

Javascript Error: too much recursion 这通常意味着有错字 在您的图表规范中。请参阅 javascript 控制台以获取完整信息 追溯。

【问题讨论】:

    标签: python altair


    【解决方案1】:

    看起来渲染器无法处理包含数百个条目的显式排序顺序;这可能是 Vega 中的一个错误,但它也有点反模式。

    尝试做这样的事情:

    alt.Chart(df.reset_index()).mark_rect().encode(
        x=alt.X('time', sort=alt.SortField('index')),
        color='value:Q'
    )
    

    【讨论】:

    • 嗨 jakevdp!谢谢你的建议,但我不知道如何使用它:我已经用你的 sn-p 替换了图表生成代码,但我根本没有得到任何输出(即使 render_hours 设置为 12,通常会呈现)
    • 我不知道问题可能是什么——当我运行它时它会起作用。这是 Colab 中的一个工作版本,您可以尝试:colab.research.google.com/drive/…
    • 谢谢,这对我帮助很大!看起来我们已将问题隔离到我的环境中
    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多