『玩转Streamlit』--集成Plotly
之前介绍了如何在Streamlit App
中使用Matplotlib
库来绘图。
本篇介绍 Steamlit
结合Poltly
的方法,相比于Matplotlib
,Poltly
的交互性更强,
更适合在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
参数有以下几种取值:
ignore
:不对图表中的任何选择事件做出反应rerun
:在图表中选择数据时,会重新运行应用程序可调用对象****
:会重新运行应用程序,并在应用程序的其余部分之前执行该可调用对象作为回调函数
selection_mode
参数定义图表的选择模式,包括:
points
:允许基于单个数据点进行选择box
:允许基于矩形区域进行选择lasso
:允许基于自由绘制区域进行选择
on_select
不同时,页面的效果如下:
1.1. on_select=ignore
ignore
是on_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. 使用示例
下面通过示例演示实际场景中如何使用streamlit
和Poltly
图表。
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的更多相关文章
- Github 恶搞教程(一起『玩坏』自己的 Github 吧)
最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
- 2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析
2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析 --------CONTENTS-------- 一.原理与实践说明 1.实践目标 2.实践内容概述 3.基础问题回答 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析
2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌图片:自己的图片控件
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- 『Asp.Net 组件』第一个 Asp.Net 服务器组件:自己的文本框控件
代码: using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace DemoWebControl ...
- 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势
在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...
- 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...
随机推荐
- Oracle、MySQL等数据库故障处理优质文章分享 | 10月汇总
墨天轮社区于9月起持续举办[聊聊故障处理那些事儿]DBA专题征文活动,每月进行评优发奖,鼓励大家记录工作中遇到的数据库故障处理过程,不仅用于自我复盘与分析,同时也能帮助其他的同仁们避坑. 上月为大家梳 ...
- 1. java + react 实现 HRM
1. 云服务的三种方式 1.1 IAAS 基础设施即服务 ,只会提供基础的设施,eg:服务器,网络等 : 1.2 PAAS 平台即服务 ,提供平台,可以把自己写好的代码部署到平台上 : 1.3 SAA ...
- 一些新奇的玩意【php篇--持续更新】
人不进步就等于退步! 接触越多的人以及事就能学到更多的东西. 以下仅为本人记录的一些新奇的东西,不喜勿喷! 1.??运算符号,在新的项目中突然发现很多红线报错,还以为是错误!看了下,是??运算的问题, ...
- C#实现信创国产Linux麦克风摄像头推流(源码,银河麒麟、统信UOS)
随着国际政治经济形势的变化,尤其是中美科技竞争日益激烈,软件信创国产化已经迫在眉睫.在这种大环境下,我们将现有的Windows版软件逐步迁移到信创国产化基础设施上,适配国产操作系统(如银河麒麟.统信U ...
- C语言之输入输出
标准库 IO 输入输出功能并非C语言的组成部分,ANSI标准定义了相关的库函数 输入输出 <stdio.h> 流stream是与设备关联的数据的源或者目的地. 文本流:由文本行组成的序列 ...
- SpringBoot读取properties文件配置项
使用SpringBoot开发过程中,难免需要配置相关数据项,然后在Java代码中@Autowired注入并使用. 我们应该如何读取properties文件中的配置项呢? 基于SpringBoot项目, ...
- Go服务自动触发单元测试覆盖率
一.用到的工具 Gitlab Jenkins Shell go test 二.实现原理 在gitlab上配置jenkins的webhook,当有代码变更时自动触发jenkins构建job,job内的s ...
- MoeCTF2024--Crypto--Week1&Week2
MOECTF (CRYPTO) Week1: 1.入门指北 题目: from Crypto.Util.number import bytes_to_long, getPrime from secret ...
- Python中序列化/反序列化JSON格式的数据
基本概念 JSON: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于 ...
- 鸿蒙NEXT开发案例:光强仪
[引言] 本文将介绍如何使用鸿蒙NEXT框架开发一个简单的光强仪应用,该应用能够实时监测环境光强度,并给出相应的场景描述和活动建议. [环境准备] 电脑系统:windows 10 开发工具:DevEc ...