首页 > 其他分享 >『玩转Streamlit』--集成Plotly

『玩转Streamlit』--集成Plotly

时间:2024-12-24 09:56:43浏览次数:3  
标签:Plotly -- chart st 图表 df plotly Streamlit select

之前介绍了如何在Streamlit App中使用Matplotlib库来绘图。

本篇介绍 Steamlit结合Poltly的方法,相比于MatplotlibPoltly的交互性更强,

更适合在Web应用中做为可视化的工具。

1. st.plotly_chart函数

st.plotly_chart函数专门用于在Steamlit应用中显示 Plotly 绘制的图形。

这个函数能够直接将Plotly Figure对象或者Poltly支持的数据对象直接渲染到页面的指定位置上。

st.plotly_chart的参数不多,与st.pyplot比,多了一些交互用的参数:

名称 类型 说明
figure_or_data Figure或Data对象
theme str 指定图表的主题
use_container_width bool 决定是否使用父容器的宽度覆盖图形的原始宽度
key str 为元素提供标识
on_select str 控制图表如何响应用户选择事件
selection_mode str 图表的选择模式

因为Plotly绘制的图形可交互,通过key参数,在交互的过程中,我们可以精确地定位到交互的图表。

on_select参数有以下几种取值:

  1. ignore:不对图表中的任何选择事件做出反应
  2. rerun:在图表中选择数据时,会重新运行应用程序
  3. 可调用对象****:会重新运行应用程序,并在应用程序的其余部分之前执行该可调用对象作为回调函数

selection_mode参数定义图表的选择模式,包括:

  1. points:允许基于单个数据点进行选择
  2. box:允许基于矩形区域进行选择
  3. lasso:允许基于自由绘制区域进行选择

on_select不同时,页面的效果如下:

1.1. on_select=ignore

ignoreon_select的默认值,此时Plotly图形上无法选择对象。

import streamlit as st
import plotly.express as px

df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length")


st.plotly_chart(fig, key="iris")
# 或者
# st.plotly_chart(fig, key="iris", on_select="ignore")

此时,工具栏上没有选择数据的小工具。

1.2. on_select=rerun

此时,st.plotly_chart会将选择的数据点返回。

选择数据点时,可以切换成矩形选择自由区域选择。

event = st.plotly_chart(fig, key="iris", on_select="rerun")
event

1.3. on_select=callable

on_select=callable的效果on_select=rerun差不多,也能对数据点选择并得到选择的数据点。

不同之处在于,可以在选择数据点之后,调用callable函数进行额外的处理。

def handle_selection():
    from datetime import datetime

    st.write(f"Selected data at {datetime.now()}")


event = st.plotly_chart(fig, key="iris", on_select=handle_selection)
event

每次选择数据之后,上面的时间都会变化,说明handle_selection函数在每次选择数据之后都被回调。

2. 使用示例

下面通过示例演示实际场景中如何使用streamlitPoltly图表。

2.1. 销售数据时间序列分析

在这个示例中,首先创建了一个模拟的销售数据时间序列,然后通过st.plotly_chart展示图表,并设置on_select回调函数来处理用户在图表上的选择操作。

当用户选择图上的点时,会在 Streamlit 应用中显示所选数据点对应的日期和销售额信息。

import streamlit as st
import plotly.express as px
import pandas as pd

# 模拟销售数据
data = {
    "Date": pd.date_range(start="2024-01-01", periods=100),
    "Sales": [i**2 + 50 + 10 * (i % 10) for i in range(100)],
}
df = pd.DataFrame(data)

# 创建时间序列折线图
fig = px.scatter(df, x="Date", y="Sales")


# 显示图表并处理选择事件
def handle_selection():
    selected_points = st.session_state["sales_chart"].selection.points
    st.write("已选择的数据点:")
    df = pd.DataFrame(columns=["日期", "销售额"])

    for idx, p in enumerate(selected_points):
        df.loc[idx, "日期"] = p["x"]
        df.loc[idx, "销售额"] = p["y"]

    st.dataframe(df)


st.plotly_chart(fig, key="sales_chart", on_select=handle_selection)

2.2. 模拟股票分析

使用generate_stock_data函数生成模拟的股票数据,再使用plotly.graph_objects创建一个烛台图,将模拟数据绘制到图表中。

编写一个回调函数,当用户在图表上选择某个点时,它会获取所选点的详细信息并在 Streamlit 应用中展示出来。

import streamlit as st
import plotly.graph_objects as go
import pandas as pd
import numpy as np


# 生成随机模拟的股票数据
def generate_stock_data(days=300):
    dates = pd.date_range(start="2024-01-01", periods=days)
    open_prices = np.random.rand(days) * 100 + 50
    high_prices = open_prices + np.random.rand(days) * 10
    low_prices = open_prices - np.random.rand(days) * 10
    close_prices = open_prices + np.random.randn(days) * 5

    data = {
        "Date": dates,
        "Open": open_prices,
        "High": high_prices,
        "Low": low_prices,
        "Close": close_prices,
    }
    return pd.DataFrame(data)


# 生成模拟股票数据
df = generate_stock_data()

# 创建交互式图表
fig = go.Figure(
    data=[
        go.Candlestick(
            x=df["Date"],
            open=df["Open"],
            high=df["High"],
            low=df["Low"],
            close=df["Close"],
        )
    ]
)

fig.update_layout(title="模拟股票价格", xaxis_title="Date", yaxis_title="Price")


# onselect 回调函数
def handle_selection():
    selected_points = st.session_state.stock_chart.selection.points
    st.write("Selected Stock Data Points:")

    df = pd.DataFrame(columns=["日期", "开盘价", "收盘价", "最高价", "最低价"])

    for idx, p in enumerate(selected_points):
        print(idx, p)
        df.loc[idx, "日期"] = p["x"]
        df.loc[idx, "开盘价"] = p["open"]
        df.loc[idx, "收盘价"] = p["close"]
        df.loc[idx, "最高价"] = p["high"]
        df.loc[idx, "最低价"] = p["low"]

    st.dataframe(df)


# 显示图表
st.plotly_chart(fig, key="stock_chart", on_select=handle_selection)

3. 总结

Streamlit 可以简化 Web 应用构建流程,Plotly 提供丰富图表类型,二者结合能快速将数据转化为交互式可视化应用,节省开发时间。

此外,Plotly 图表交互性高,在 Streamlit 应用中可实现数据探索、筛选等操作,增强用户体验。

标签:Plotly,--,chart,st,图表,df,plotly,Streamlit,select
From: https://www.cnblogs.com/wang_yb/p/18626670

相关文章

  • props的使用
    props的使用父组件通过props给子组件传递基础上获取并添加限制条件​ 注意:一些属性必须加:使其是计算属性,否则传递的是字符串​ 注意:defineProps一般defineXxx函数是宏函数可以不用引入,但是我在使用的时候需要引入,可能是语法检查或者其他ts约束文件://限制单个定义一......
  • 小程序商城店铺怎么开?几招教你搞掂线上开铺难题(教程大全)
    随着电商的快速发展,很多传统商家都开始尝试在微信等平台上开设小程序商城。但对于很多人来说,开设一个小程序商城似乎还是有点难度。其实只要掌握了一些步骤和技巧,轻松开设自己的线上店铺也并不难。本文将通过几个简单的步骤,带你从零开始,教你如何搭建一个小程序商城,并分享一......
  • 【高清视频方案分享】12G-SDI与CameraLink输入输出,基于RK3588J+FPGA工业平台
    CameraLink协议介绍CameraLink是一种用于机器视觉和工业成像应用的标准化数字接口协议。它由自动化成像协会(AutomatedImagingAssociation)开发,旨在解决传统模拟视频接口的局限性,提供一种高效、可靠且易于使用的数字解决方案,以实现相机与图像处理系统之间的高速数据传输。 Cam......
  • 小程序商城制作教程就用这个方法,百试百灵(教程大全)
    随着移动互联网的发展,越来越多的商家开始关注如何通过小程序商城来拓展自己的业务。说到小程序商城制作,很多人可能觉得它很复杂或者需要很高的技术门槛,其实完全不必担心!今天我将通过这篇文章,带大家从零开始,一步步了解小程序商城的制作方法,帮助商家们快速入门并应用到实际......
  • 1
    ......
  • 小程序商城制作公司哪个好?选择忧郁症可以自行看看哈(教程大全)
    随着微信小程序商城的火爆,越来越多的商家开始寻找合适的公司来帮助他们搭建自己的商城。那么,面对众多的选择,如何找到适合自己需求的公司呢?本篇文章将分享一些关于选择小程序商城制作公司的小技巧,结合一些网友的反馈和真实案例,帮助大家在海量的选择中做出明智的决策。文章......
  • 组件生命周期
    对生命周期的理解参考地址:https://cn.vuejs.org/guide/essentials/lifecycle.html注意:以下只说明的常用的几个组件生命周期,并不是所有。​ 为了测试生命周期,下载了对应vue2所需要的vue.jsdevtools6.6.4来源于谷歌商城,这里有时不显示注意清理缓存,或者刷新,已经卸载换了最......
  • git仓库多人协作新建分支 合并到主分支流程详解
    在多人协作的Git仓库中,新建分支并最终将其合并到主分支的流程是为了实现团队协作、提高代码的可管理性、确保代码质量,并且避免多人同时修改同一部分代码导致冲突。以下是这个流程的目的和具体步骤。目录1. 在 master 上新建一个分支2. 进行功能开发3. 合并功能分......
  • 存储
    存储每个微信小程序都可以有自己的本地缓存,可以通过wx.setStorage/wx.setStorageSync、wx.getStorage/wx.getStorageSync、wx.clearStorage/wx.clearStorageSync,wx.removeStorage/wx.removeStorageSync对本地缓存进行读写和清理。隔离策略同一个微信用户,同一个小程序storage......
  • 文件系统
    文件系统文件系统是小程序提供的一套以小程序和用户维度隔离的存储以及一套相应的管理接口。通过wx.getFileSystemManager()可以获取到全局唯一的文件系统管理器,所有文件系统的管理操作通过FileSystemManager来调用。varfs=wx.getFileSystemManager()文件主要分为两大......