使用Vega-Lite库显示图表。

Vega-Lite 是一种用于定义交互式图形的高级语法。

函数签名[source]

st.vega_lite_chart(data=None, spec=None, *, use_container_width=False, theme="streamlit", key=None, on_select="ignore", selection_mode=None, **kwargs)

参数

data (Anything supported by st.dataframe)

要绘制的数据或包含数据的Vega-Lite规范(更接近Vega-Lite API)。

spec (dict or None)

图表的Vega-Lite规范。如果specNone(默认值), Streamlit将使用data中传递的规范。您不能同时向dataspec传递规范。更多信息请参见 https://vega.github.io/vega-lite/docs/

use_container_width (bool)

是否用父容器的宽度覆盖图形的原生宽度。如果use_container_widthFalse (默认),Streamlit会根据绘图库设置图表的宽度以适应其内容,直到父容器的宽度。如果use_container_widthTrue,Streamlit会将图形的宽度设置为与父容器的宽度匹配。

theme ("streamlit" 或 None)

图表的主题。如果 theme"streamlit"(默认值), Streamlit 使用其自己的设计默认值。如果 themeNone, Streamlit 回退到库的默认行为。

key (str)

一个可选的字符串,用于给这个元素一个稳定的身份。如果 keyNone(默认值),这个元素的身份将基于其他参数的值来确定。

此外,如果启用了选择并且提供了 key,Streamlit 将在会话状态中注册该键以存储选择状态。选择状态是只读的。

on_select ("ignore", "rerun", or callable)

图表应如何响应用户选择事件。这控制图表是否表现得像一个输入小部件。on_select 可以是以下之一:

  • "ignore"(默认):Streamlit 不会对图表中的任何选择事件做出反应。图表不会表现得像一个输入小部件。
  • "rerun":当用户在图表中选择数据时,Streamlit 将重新运行应用程序。在这种情况下,st.vega_lite_chart 将返回选择数据作为字典。
  • 一个callable:Streamlit 将重新运行应用程序并在应用程序的其余部分之前执行callable作为回调函数。在这种情况下,st.vega_lite_chart 将返回选择数据作为字典。

要使用选择事件,dataspec 中定义的 Vega-Lite 规范必须包括来自图表库的选择参数。要了解如何在 Vega-Lite 中定义交互,请参阅 Vega-Lite 文档中的Dynamic Behaviors with Parameters

selection_mode (str or Iterable of str)

Streamlit 应使用的选择参数。如果 selection_modeNone(默认),Streamlit 将使用图表 Vega-Lite 规范中定义的所有 选择参数。

当 Streamlit 使用选择参数时,来自该 参数的选择将触发重新运行并包含在选择 状态中。当 Streamlit 不使用选择参数时, 来自该参数的选择将不会触发重新运行,也不会 包含在选择状态中。

选择参数由其 name 属性标识。

**kwargs (any)

作为关键字的图表的Vega-Lite规范。这是spec的替代方案。

返回

(element or dict)

如果 on_select"ignore"(默认值),此命令返回一个 用于图表元素的内部占位符,可以与 .add_rows() 方法一起使用。否则,此命令返回一个 类似字典的对象,支持键和属性 表示法。属性由 VegaLiteState 字典模式描述。

示例

import streamlit as st
import pandas as pd
import numpy as np

chart_data = pd.DataFrame(np.random.randn(200, 3), columns=["a", "b", "c"])

st.vega_lite_chart(
   chart_data,
   {
       "mark": {"type": "circle", "tooltip": True},
       "encoding": {
           "x": {"field": "a", "type": "quantitative"},
           "y": {"field": "b", "type": "quantitative"},
           "size": {"field": "c", "type": "quantitative"},
           "color": {"field": "c", "type": "quantitative"},
       },
   },
)

可以在https://vega.github.io/vega-lite/examples/找到不使用Streamlit的Vega-Lite使用示例。大多数示例都可以轻松转换为上面显示的语法。

Vega-Lite事件状态的模式。

事件状态存储在一个类似字典的对象中,该对象支持键和属性表示法。事件状态不能通过会话状态以编程方式更改或设置。

目前仅支持选择事件。

属性

selection (dict)

on_select 事件的状态。此属性返回一个类似字典的对象,支持键和属性表示法。 每个 Vega-Lite 选择参数的名称成为 selection 字典中的一个属性。每个属性中数据的格式由 Vega-Lite 中的选择参数定义决定。

示例

以下两个示例具有等效的定义。每个示例都包含一个点和区间选择参数,这些参数包含在图表定义中。点选择参数名为"point_selection"。区间或框选择参数名为"interval_selection"

以下示例使用 st.altair_chart

import streamlit as st
import pandas as pd
import numpy as np
import altair as alt

if "data" not in st.session_state:
    st.session_state.data = pd.DataFrame(
        np.random.randn(20, 3), columns=["a", "b", "c"]
    )
df = st.session_state.data

point_selector = alt.selection_point("point_selection")
interval_selector = alt.selection_interval("interval_selection")
chart = (
    alt.Chart(df)
    .mark_circle()
    .encode(
        x="a",
        y="b",
        size="c",
        color="c",
        tooltip=["a", "b", "c"],
        fillOpacity=alt.condition(point_selector, alt.value(1), alt.value(0.3)),
    )
    .add_params(point_selector, interval_selector)
)

event = st.altair_chart(chart, key="alt_chart", on_select="rerun")

event

以下示例使用 st.vega_lite_chart

import streamlit as st
import pandas as pd
import numpy as np

if "data" not in st.session_state:
    st.session_state.data = pd.DataFrame(
        np.random.randn(20, 3), columns=["a", "b", "c"]
    )

spec = {
    "mark": {"type": "circle", "tooltip": True},
    "params": [
        {"name": "interval_selection", "select": "interval"},
        {"name": "point_selection", "select": "point"},
    ],
    "encoding": {
        "x": {"field": "a", "type": "quantitative"},
        "y": {"field": "b", "type": "quantitative"},
        "size": {"field": "c", "type": "quantitative"},
        "color": {"field": "c", "type": "quantitative"},
        "fillOpacity": {
            "condition": {"param": "point_selection", "value": 1},
            "value": 0.3,
        },
    },
}

event = st.vega_lite_chart(
    st.session_state.data, spec, key="vega_chart", on_select="rerun"
)

event

尝试在这个交互式示例中选择点。当你点击一个点时,选择将出现在属性"point_selection"下,这是给点选择参数的名称。同样地,当你进行区间选择时,它将出现在属性"interval_selection"下。如果需要,你可以给你的选择参数其他名称。

如果您在选择点时按住Shift键,现有的点选择将被保留。在进行额外选择时,区间选择不会被保留。

将数据框连接到当前数据框的底部。

函数签名[来源]

element.add_rows(data=None, **kwargs)

参数

data (pandas.DataFrame, pandas.Styler, pyarrow.Table, numpy.ndarray, pyspark.sql.DataFrame, snowflake.snowpark.dataframe.DataFrame, Iterable, dict, or None)

要连接的表格。可选。

**kwargs (pandas.DataFrame, numpy.ndarray, Iterable, dict, or None)

要连接的有名称的数据集。可选。你只能传入1个数据集(包括在data参数中的那个)。

示例

import streamlit as st
import pandas as pd
import numpy as np

df1 = pd.DataFrame(
    np.random.randn(50, 20), columns=("col %d" % i for i in range(20))
)

my_table = st.table(df1)

df2 = pd.DataFrame(
    np.random.randn(50, 20), columns=("col %d" % i for i in range(20))
)

my_table.add_rows(df2)
# Now the table shown in the Streamlit app contains the data for
# df1 followed by the data for df2.

你可以对图表做同样的事情。例如,如果你想在折线图中添加更多数据:

# Assuming df1 and df2 from the example above still exist...
my_chart = st.line_chart(df1)
my_chart.add_rows(df2)
# Now the chart shown in the Streamlit app contains the data for
# df1 followed by the data for df2.

对于数据集已命名的图表,您可以使用关键字参数传递数据,其中键是名称:

my_chart = st.vega_lite_chart(
    {
        "mark": "line",
        "encoding": {"x": "a", "y": "b"},
        "datasets": {
            "some_fancy_name": df1,  # <-- named dataset
        },
        "data": {"name": "some_fancy_name"},
    }
)
my_chart.add_rows(some_fancy_name=df2)  # <-- name used as keyword

Vega-Lite 图表默认使用 Streamlit 主题显示。该主题简洁、用户友好,并融入了 Streamlit 的调色板。额外的好处是,您的图表可以更好地与应用程序的其他设计部分集成。

Streamlit 主题从 Streamlit 1.16.0 开始通过 theme="streamlit" 关键字参数提供。要禁用它并使用 Vega-Lite 的原生主题,请改用 theme=None

让我们看一下使用Streamlit主题和原生Vega-Lite主题的图表示例:

import streamlit as st from vega_datasets import data source = data.cars() chart = { "mark": "point", "encoding": { "x": { "field": "Horsepower", "type": "quantitative", }, "y": { "field": "Miles_per_Gallon", "type": "quantitative", }, "color": {"field": "Origin", "type": "nominal"}, "shape": {"field": "Origin", "type": "nominal"}, }, } tab1, tab2 = st.tabs(["Streamlit theme (default)", "Vega-Lite native theme"]) with tab1: # Use the Streamlit theme. # This is the default. So you can also omit the theme argument. st.vega_lite_chart( source, chart, theme="streamlit", use_container_width=True ) with tab2: st.vega_lite_chart( source, chart, theme=None, use_container_width=True )

点击下面交互式应用程序中的标签,查看启用和禁用Streamlit主题的图表。

如果你在担心你自己的自定义设置是否仍然会被考虑,不用担心!你仍然可以更改你的图表配置。换句话说,尽管我们现在默认启用了Streamlit主题,但你可以用自定义颜色或字体覆盖它。例如,如果你想让图表线条变成绿色而不是默认的红色,你可以做到!

forum

还有问题吗?

我们的 论坛 充满了有用的信息和Streamlit专家。