使用PyDeck库绘制图表。

这支持3D地图、点云等!更多关于PyDeck的信息请访问https://deckgl.readthedocs.io/en/latest/

这些文档也非常有用:

使用此命令时,Mapbox 提供地图瓦片以渲染地图内容。请注意,Mapbox 是第三方产品,Streamlit 对 Mapbox 或 Mapbox 提供的任何内容或信息不承担任何责任或义务。

Mapbox 要求用户注册并提供令牌,然后用户才能请求地图瓦片。目前,Streamlit 为您提供了此令牌,但这可能随时更改。我们强烈建议所有用户创建并使用自己的个人 Mapbox 令牌,以避免对其体验造成任何中断。您可以使用 mapbox.token 配置选项来执行此操作。Mapbox 的使用受 Mapbox 使用条款的约束。

要为自己获取令牌,请在https://mapbox.com创建一个账户。 有关如何设置配置选项的更多信息,请参阅 https://docs.streamlit.io/develop/api-reference/configuration/config.toml

函数签名[source]

st.pydeck_chart(pydeck_obj=None, *, use_container_width=False, width=None, height=None, selection_mode="single-object", on_select="ignore", key=None)

参数

pydeck_obj (pydeck.Deck or None)

指定要绘制的PyDeck图表的对象。

use_container_width (bool)

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

width (int or None)

图表所需的宽度,以像素表示。如果 widthNone(默认值),Streamlit 会根据绘图库将图表的宽度设置为适合其内容,最大不超过父容器的宽度。如果 width 大于父容器的宽度,Streamlit 会将图表宽度设置为与父容器的宽度匹配。

要使用 width,必须设置 use_container_width=False

height (int or None)

图表所需的高度,以像素表示。如果heightNone(默认值),Streamlit会根据绘图库自动调整图表的高度以适应其内容。

on_select ("ignore" 或 "rerun" 或 callable)

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

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

如果 on_select 不是 "ignore",所有层必须声明一个 id 以保持图表在重新运行时的状态。

selection_mode ("single-object" 或 "multi-object")

图表的选取模式。可以是以下之一:

  • "single-object" (默认): 一次只能选择一个对象。
  • "multi-object": 一次可以选择多个对象。

key (str)

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

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

返回

(element or dict)

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

示例

这里有一个使用HexagonLayer和ScatterplotLayer的图表。它根据当前激活的Streamlit主题使用浅色或深色地图样式:

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

chart_data = pd.DataFrame(
    np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
    columns=["lat", "lon"],
)

st.pydeck_chart(
    pdk.Deck(
        map_style=None,
        initial_view_state=pdk.ViewState(
            latitude=37.76,
            longitude=-122.4,
            zoom=11,
            pitch=50,
        ),
        layers=[
            pdk.Layer(
                "HexagonLayer",
                data=chart_data,
                get_position="[lon, lat]",
                radius=200,
                elevation_scale=4,
                elevation_range=[0, 1000],
                pickable=True,
                extruded=True,
            ),
            pdk.Layer(
                "ScatterplotLayer",
                data=chart_data,
                get_position="[lon, lat]",
                get_color="[200, 30, 0, 160]",
                get_radius=200,
            ),
        ],
    )
)

注意

为了使PyDeck图表的样式与Streamlit的主题保持一致, 你可以在pydeck.Deck对象中设置map_style=None

PyDeck 事件状态的模式。

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

目前仅支持选择事件。

属性

selection (dict)

on_select 事件的状态。此属性返回一个类似字典的对象,支持键和属性表示法。 属性由 PydeckSelectionState 字典模式描述。

PyDeck 图表选择状态的模式。

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

您必须在pydeck.Layer中定义id,以确保在使用st.pydeck_chart进行选择时保持状态。

属性

indices (dict[str, list[int]])

按层选择的对象的字典。字典中的每个键是一个层ID,每个值是该层内对象的索引列表。

objects (dict[str, list[dict[str, Any]]])

按层划分的对象属性字典。字典中的每个键是一个层ID,每个值是该层中选定对象的元数据字典列表。

示例

以下示例启用了多对象选择功能。图表显示了根据人口(2023年美国人口普查估计)排列的美国州首府。您可以从GitHub访问此数据

import streamlit as st
import pydeck
import pandas as pd

capitals = pd.read_csv(
    "capitals.csv",
    header=0,
    names=[
        "Capital",
        "State",
        "Abbreviation",
        "Latitude",
        "Longitude",
        "Population",
    ],
)
capitals["size"] = capitals.Population / 10

point_layer = pydeck.Layer(
    "ScatterplotLayer",
    data=capitals,
    id="capital-cities",
    get_position=["Longitude", "Latitude"],
    get_color="[255, 75, 75]",
    pickable=True,
    auto_highlight=True,
    get_radius="size",
)

view_state = pydeck.ViewState(
    latitude=40, longitude=-117, controller=True, zoom=2.4, pitch=30
)

chart = pydeck.Deck(
    point_layer,
    initial_view_state=view_state,
    tooltip={"text": "{Capital}, {Abbreviation}\nPopulation: {Population}"},
)

event = st.pydeck_chart(chart, on_select="rerun", selection_mode="multi-object")

event.selection

这是从具有ID "captial-cities" 的图层中选择单个对象时的选择状态示例:

{
  "indices":{
    "capital-cities":[
      2
    ]
  },
  "objects":{
    "capital-cities":[
      {
        "Abbreviation":" AZ"
        "Capital":"Phoenix"
        "Latitude":33.448457
        "Longitude":-112.073844
        "Population":1650070
        "State":" Arizona"
        "size":165007.0
      }
    ]
  }
}
forum

还有问题吗?

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