之前介绍了如何在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 应用中可实现数据探索、筛选等操作,增强用户体验。

『玩转Streamlit』--集成Plotly的更多相关文章

  1. Github 恶搞教程(一起『玩坏』自己的 Github 吧)

    最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...

  2. js实现『加载更多』功能实例

    DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...

  3. 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践

    2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...

  4. 2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析

    2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析 --------CONTENTS-------- 一.原理与实践说明 1.实践目标 2.实践内容概述 3.基础问题回答 ...

  5. 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来

    代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...

  6. 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析

    2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...

  7. 『Asp.Net 组件』Asp.Net 服务器组件 内嵌图片:自己的图片控件

    代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...

  8. 『Asp.Net 组件』第一个 Asp.Net 服务器组件:自己的文本框控件

    代码: using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace DemoWebControl ...

  9. 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势

    在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...

  10. 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描

    2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...

随机推荐

  1. MYSQL存储过程-练习2 while 循环

    MYSQL存储过程-练习2 while 循环 1 #WHILE循环 2 DELIMITER $$ 3 4 CREATE PROCEDURE `sp_while`() 5 BEGIN 6 DECLARE ...

  2. C# 并发控制框架:单线程环境下实现每秒百万级调度

    前言 在工业自动化和机器视觉领域,对实时性.可靠性和效率的要求越来越高.为了满足这些需求,我们开发了一款专为工业自动化运动控制和机器视觉流程开发设计的 C# 并发流程控制框架. 该框架不仅适用于各种工 ...

  3. 在 Kubernetes 中实现微服务应用监控

    张坚,科大讯飞开发工程师,云原生爱好者. 本篇文章我们基于 Prometheus 和 Grafana 实现微服务应用监控. KubeSphere 平台本身提供了监控功能,包括节点状态.集群资源使用率. ...

  4. 在C#中基于Semantic Kernel的检索增强生成(RAG)实践

    Semantic Kernel简介 玩过大语言模型(LLM)的都知道OpenAI,然后微软Azure也提供了OpenAI的服务:Azure OpenAI,只需要申请到API Key,就可以使用这些AI ...

  5. C# 13(.Net 9) 中的新特性 - 半自动属性

    C# 13 即 .Net 9 按照计划会在2024年11月发布,目前一些新特性已经定型,今天让我们来预览其中的一个新特性: 作者注:该特性虽然随着 C# 13 发布,但是仍然是处于 preview 状 ...

  6. Java面试真题之中级进阶(线程,进程,序列化,IO流,NIO)

    前言 本来想着给自己放松一下,刷刷博客,慕然回首,线程.程序.进程?Java 序列化?Java 中 IO 流? Java IO与 NIO的区别(补充)?似乎有点模糊了,那就大概看一下Java基础面试题 ...

  7. 2.8 忘记root账户密码怎么办?

    Linux 的单用户模式有些类似 Windows 的安全模式,只启动最少的程序用于系统修复.在单用户模式(运行级别为 1)中,Linux 引导进入根 shell,网络被禁用,只有少数进程运行. 单用户 ...

  8. 推荐一个跨平台支持Word, Excel, CSV, Email等30多种格式的操作库

    更多开源项目请查看:一个专注推荐优秀.Net开源项目的榜单 在我们日常项目开发中,经常需要解析操作文档,比如Office文档.Email文件.PDF.Xml.图片.Mp3等音频文件,操作Office. ...

  9. 模拟器(Nintendo,Genesis,SFC,MD,土星,PS,PS2,PS3,Wii,Xbox等)游戏下载网址

    最近想拿个英文游戏复习复习,国内的emu618关闭之后难得寻到很完整的游戏库 通过 https://www.fantasyanime.com/mana/som2downloads.htm 找到 htt ...

  10. Java线程池架构2-多线程调度器

      http://ifeve.com/java线程池架构2-多线程调度器(scheduledthreadpoolexecutor)/ 在前面介绍了java的多线程的基本原理信息:<Java线程池 ...