You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于示例创建Streamlit-Altair图表却无数据显示的问题

问题:Streamlit中Altair图表为空,无法显示数据

我尝试基于Vega-Lite的交互条形图示例,用streamlit-altair实现图表,但应用中的图表为空,无法显示完整数据,实现代码如下:

import altair as alt
import streamlit as st

from view.frontend.path import BasePath

chart_spec = {
    "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
    "description": "A bar chart with highlighting on hover and selecting on click. (Inspired by Tableau's interaction style.)",
    "data": {
        "values": [
            {"a": "A", "b": 28}, {"a": "B", "b": 55}, {"a": "C", "b": 43},
            {"a": "D", "b": 91}, {"a": "E", "b": 81}, {"a": "F", "b": 53},
            {"a": "G", "b": 19}, {"a": "H", "b": 87}, {"a": "I", "b": 52},
        ]
    },
    "params": [
        {
            "name": "highlight",
            "select": {"type": "point", "on": "pointerover"}
        },
        {"name": "select", "select": "point"}
    ],
    "mark": {
        "type": "bar",
        "fill": "#4C78A8",
        "stroke": "black",
        "cursor": "pointer",
    },
    "encoding": {
        "x": {"field": "a", "type": "ordinal"},
        "y": {"field": "b", "type": "quantitative"},
        "fillOpacity": {
            "condition": {"param": "select", "value": 1},
            "value": 0.3,
        },
        "strokeWidth": {
            "condition": [
                {
                    "param": "select",
                    "empty": False,
                    "value": 2,
                },
                {
                    "param": "highlight",
                    "empty": False,
                    "value": 1,
                }
            ],
            "value": 0
        }
    },
    "config": {
        "scale": {"bandPaddingInner": 0.2}
    }
}

class Path(BasePath):
    def __init__(self, payload: dict):
        self._path_spec = payload

    def render(self, container):
        with container:
            # Altair Chart
            chart = alt.Chart().from_dict(chart_spec)

            # Display chart in Streamlit
            click_event = st.altair_chart(
                chart, use_container_width=True, on_select="rerun"
            )

            # Catch the click and display result
            if click_event is not None:
                st.write(f"Clicked on: {click_event}")

错误原因及修复方案

  • 核心错误:图表初始化方式不正确
    你使用alt.Chart().from_dict(chart_spec)的写法是错误的——这种方式会创建一个空Chart实例再加载spec,导致spec中定义的data无法正确关联到图表上。正确的做法是直接调用alt.from_dict()加载完整的spec。

  • 修复后的图表初始化代码:
    将:

    chart = alt.Chart().from_dict(chart_spec)
    

    修改为:

    chart = alt.from_dict(chart_spec)
    
  • 可选优化:点击事件解析
    原代码输出的点击事件是原始结构,可读性较差,可以调整为提取具体选中数据:

    if click_event:
        selected_points = click_event.get('selection', {}).get('select', {}).get('points', [])
        if selected_points:
            st.write(f"选中项:{selected_points[0]['a']},数值:{selected_points[0]['b']}")
    

内容的提问来源于stack exchange,提问作者HuLu ViCa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:03:23