『Plotly实战指南』--Plotly与Streamlit结合实战
关于Streamlit的介绍,可参考《玩转Streamlit》系列
在当今数据驱动的时代,快速构建交互式工具并直观地将数据分析结果交付给用户,已成为数据应用开发的核心需求。
无论是企业内部的决策支持系统,还是面向公众的数据可视化平台,都需要一种高效且灵活的开发方式。
Plotly
和Streamlit
的结合,正是满足这一需求的完美解决方案。
Plotly
作为一个强大的交互式图表库,支持多种图表类型,能够轻松创建动态且美观的可视化效果。
而 Streamlit
是一个轻量级、低代码的 Web 应用框架,专注于简化数据应用的开发流程,让开发者能够快速构建并部署交互式应用。
二者的互补性显而易见:
Plotly
:支持40+
交互式图表类型,从基础折线图到 3D 曲面图应有尽有Streamlit
:用纯Python
脚本即可创建Web
应用,部署时间从数周缩短到数小时
本文主要介绍如何结合Plotly
和Streamlit
开发动态数据应用,并优化其性能。
1. Streamlit应用中嵌入Plotly图表
1.1. 静态图表嵌入
将Plotly
图表嵌入Streamlit
应用的基础方法是通过st.plotly_chart()
函数直接渲染Plotly
图表。
这种方式简单直接,能够快速将图表展示在页面上。
以下是一个将折线图和热力图嵌入 Streamlit
页面的示例代码:
import streamlit as st
import plotly.express as px
import pandas as pd
# 创建一个简单的折线图
df = pd.DataFrame({"x": [1, 2, 3, 4, 5], "y": [10, 11, 12, 13, 14]})
line_fig = px.line(df, x="x", y="y", title="折线图示例")
# 创建一个热力图
heatmap_data = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
heatmap_fig = px.imshow(heatmap_data, title="热力图示例")
# 在 Streamlit 中展示图表
st.plotly_chart(line_fig)
st.plotly_chart(heatmap_fig)
1.2. 图表与组件交互
Plotly
图表的强大之处不仅在于其静态展示能力,更在于其动态交互性。
通过结合Streamlit
的交互组件(如st.slider
和st.selectbox
),可以实现图表参数的动态控制,从而为用户提供更加灵活的可视化体验。
以下是一个案例,展示如何通过用户选择的日期范围实时更新K 线图:
import streamlit as st
import plotly.graph_objects as go
import pandas as pd
# 获取K线数据
data = pd.read_parquet(
r"/path/to/BTC-USDT_1h.parquet"
)
# 创建日期范围选择器
start_date = st.date_input("开始日期", value=data["candle_begin_time"].min())
end_date = st.date_input("结束日期", value=data["candle_begin_time"].max())
# 根据选择的日期范围筛选数据
filtered_data = data.query(
"candle_begin_time >= @start_date & candle_begin_time <= @end_date"
)
# 创建 K 线图
fig = go.Figure(
data=[
go.Candlestick(
x=filtered_data.index,
open=filtered_data["open"],
high=filtered_data["high"],
low=filtered_data["low"],
close=filtered_data["close"],
)
]
)
fig.update_layout(title="K 线图", xaxis_title="日期", yaxis_title="价格")
# 在 Streamlit 中展示图表
st.plotly_chart(fig)
在这个示例中,用户可以通过日期选择器动态调整 K 线图的显示范围,
而Plotly
图表会根据筛选后的数据实时更新,从而实现交互效果。
2. 数据驱动的交互式应用
2.1. 上传文件更新图表
在实际应用中,数据往往是动态的,用户可能需要根据不同的条件来查看不同的数据视图。
通过结合Streamlit
的输入组件(如st.file_uploader
、st.selectbox
和st.slider
),可以实现数据的动态加载和图表的动态更新。
以下是一个实战案例,展示如何构建一个动态销售分析看板,支持按地区和产品类别筛选:
import streamlit as st
import plotly.express as px
import pandas as pd
# 上传数据
uploaded_file = st.file_uploader("上传销售数据", type=["csv"])
if uploaded_file is not None:
data = pd.read_csv(uploaded_file)
# 提取地区和产品类别的列表
regions = data["地区"].unique()
products = data["产品类别"].unique()
# 创建筛选组件
selected_region = st.selectbox("选择地区", regions)
selected_product = st.selectbox("选择产品类别", products)
# 根据筛选条件过滤数据
filtered_data = data[(data["地区"] == selected_region) & (data["产品类别"] == selected_product)]
# 创建动态图表
fig = px.bar(filtered_data, x="日期", y="销售额", title="销售分析")
st.plotly_chart(fig)
在这个示例中,用户可以通过上传数据文件,并选择地区和产品类别,动态生成销售分析图表。
这种设计模式不仅提高了应用的灵活性,还增强了用户体验。
2.2. 使用缓存优化性能
在处理大量数据时,性能优化是一个不可忽视的问题。
Streamlit
提供了缓存机制,通过@st.cache_data
装饰器,可以避免重复加载和计算数据,从而显著提高应用的性能。
以下是一个示例,展示如何通过缓存优化数据处理和绘图性能:
import streamlit as st
import plotly.express as px
import pandas as pd
# 缓存数据加载函数
@st.cache_data
def load_data(file):
return pd.read_csv(file)
# 缓存图表生成函数
@st.cache_data
def create_chart(data):
return px.bar(data, x="日期", y="销售额", title="销售分析")
# 上传数据
uploaded_file = st.file_uploader("上传销售数据", type=["csv"])
if uploaded_file is not None:
# 加载数据并缓存
data = load_data(uploaded_file)
# 创建筛选组件
selected_region = st.selectbox("选择地区", data["地区"].unique())
selected_product = st.selectbox("选择产品类别", data["产品类别"].unique())
# 根据筛选条件过滤数据
filtered_data = data[(data["地区"] == selected_region) & (data["产品类别"] == selected_product)]
# 生成图表并缓存
fig = create_chart(filtered_data)
st.plotly_chart(fig)
在这个示例中,通过缓存数据加载和图表生成的过程,可以避免重复计算,从而提高应用的加载速度。
启用缓存后,用户在切换筛选条件时,图表的更新速度会明显加快。
缓存策略对比效果:
场景 | 未启用缓存 | 启用缓存 |
---|---|---|
10MB CSV加载 | 1.2s | 0.05s |
复杂图表生成 | 0.8s | 0.01s |
3. 总结
Plotly
和Streamlit
的结合为快速构建兼具交互性与美观的数据应用提供了强大的支持。
通过组件联动设计,可以实现灵活的用户交互;
通过缓存优化,可以显著提高应用的性能;
通过用户友好的界面布局,可以提升用户体验。
这种组合不仅适用于数据分析和可视化,还可以扩展到实时数据监控、机器学习模型结果可视化等更多场景。
『Plotly实战指南』--Plotly与Streamlit结合实战的更多相关文章
- 『Numpy学习指南』Matplotlib绘图
数据生成: import numpy as np import matplotlib.pyplot as plt func = np.poly1d(np.array([,,,])) func1 = f ...
- 『Numpy学习指南』排序&索引&抽取函数介绍
排序: numpy.lexsort(): numpy.lexsort()是个排字典序函数,因为很有意思,感觉也蛮有用的,所以单独列出来讲一下: 强调一点,本函数只接受一个参数! import nump ...
- 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』
作者:阿里云用户mr_wid ,z)NKt# @I6A9do 如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV RsfTUb)< 投票标题: 28.[阿里云 ...
- 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...
- 2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践
2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践 --------CONTENTS-------- 1. 免杀原理与实践说明 实验说明 基础问题回答 2. 使用msf ...
- 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图
之前写过三篇文章,收获了极其不错的阅读量与转发量: 你真的会用 VS Code 的 Ctrl.Shift和Alt吗?高效易用的快捷键:多光标.跳转引用等轻松搞定 VS Code 中的 Vim 操作 | ...
- 大数据存储:MongoDB实战指南——常见问题解答
锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
随机推荐
- 当ABB机器人外部轴驱动器过流维修
一.过流故障原因分析 电机负载异常 当ABB机器人外部轴驱动器所承受的负载超过其额定值时,电机需要产生更大的转矩以维持运行,从而导致电流增大.例如,在一些自动化生产线上,如果外部轴需要搬运的物品重量突 ...
- 个人文件转移工具-来自某位大神的C盘清理神器
软件名称:个人文件转移工具 软件功能:文件转移 支持平台:Windows 软件简介:一款文件转移工具,也可用作C盘瘦身. 软件特点: ◉ "个人文件转移工具"可以把"我的 ...
- java.lang.IllegalStateException: File name has been re-used with different files. (flume报错)
报错日志: java.lang.IllegalStateException: File name has been re-used with different files. Spooling ass ...
- 读论文-电子商务产品推荐的序列推荐系统综述与分类(A Survey and Taxonomy of Sequential Recommender Systems for E-commerce Product Recommendation)
前言 今天读的这篇文章是于2023年发表在"SN Computer Science"上的一篇论文,这篇文章主要对序列推荐系统进行了全面的调查和分类,特别是在电子商务领域的应用.文章 ...
- 6. MySQL 索引的数据结构(详细说明)
6. MySQL 索引的数据结构(详细说明) @ 目录 6. MySQL 索引的数据结构(详细说明) 1. 为什么使用索引 2. 索引及其优缺点 2.1 索引概述 3. InnoDB中索引的推演 3. ...
- 【P7&Loongson】支持部分中断/异常处理
概况 常规单发射5级流水线cpu.新增支持指令{mtc0, mfc0, eret, syscall, break, bgezal, bltzal}:新增异常处理{Int, AdEL, AdES, Ov ...
- JMeter 性能优化
Jmeter 性能优化:(3优化 + 1补充) 1.在 jmx 文件中 Disable 所有的结果输出,如: View Results Tree / Graph Results / Aggrega ...
- phpstorm、goland常用快捷键
1) 文件操作相关的快捷键 快捷键 作用 Ctrl + E 打开最近浏览过的文件 Ctrl + N 快速打开某个 struct 结构体所在的文件 Ctrl + Shift + N 快速打开文件 Shi ...
- Django实战项目-学习任务系统-查询列表分页显示
接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了. 接着优化查询列表分页显示功能,有很多菜单功能都有查询列表显示页面情况,如果数据量多,不分页显示的话,页面展示效果就不太好. 本次 ...
- Unity开发Hololens2—环境配置
博客地址:https://www.cnblogs.com/zylyehuo/ 配置如下: win11 专业版 Unity2018.4.26f1 / 2019.4.11f1 Hololens2 VS20 ...