关于Streamlit的介绍,可参考《玩转Streamlit》系列

在当今数据驱动的时代,快速构建交互式工具并直观地将数据分析结果交付给用户,已成为数据应用开发的核心需求。

无论是企业内部的决策支持系统,还是面向公众的数据可视化平台,都需要一种高效且灵活的开发方式。

PlotlyStreamlit的结合,正是满足这一需求的完美解决方案。

Plotly作为一个强大的交互式图表库,支持多种图表类型,能够轻松创建动态且美观的可视化效果。

Streamlit 是一个轻量级、低代码的 Web 应用框架,专注于简化数据应用的开发流程,让开发者能够快速构建并部署交互式应用。

二者的互补性显而易见:

  • Plotly:支持 40+ 交互式图表类型,从基础折线图到 3D 曲面图应有尽有
  • Streamlit:用纯 Python 脚本即可创建 Web 应用,部署时间从数周缩短到数小时

本文主要介绍如何结合PlotlyStreamlit开发动态数据应用,并优化其性能。

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.sliderst.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_uploaderst.selectboxst.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. 总结

PlotlyStreamlit的结合为快速构建兼具交互性与美观的数据应用提供了强大的支持。

通过组件联动设计,可以实现灵活的用户交互;

通过缓存优化,可以显著提高应用的性能;

通过用户友好的界面布局,可以提升用户体验。

这种组合不仅适用于数据分析和可视化,还可以扩展到实时数据监控、机器学习模型结果可视化等更多场景。

『Plotly实战指南』--Plotly与Streamlit结合实战的更多相关文章

  1. 『Numpy学习指南』Matplotlib绘图

    数据生成: import numpy as np import matplotlib.pyplot as plt func = np.poly1d(np.array([,,,])) func1 = f ...

  2. 『Numpy学习指南』排序&索引&抽取函数介绍

    排序: numpy.lexsort(): numpy.lexsort()是个排字典序函数,因为很有意思,感觉也蛮有用的,所以单独列出来讲一下: 强调一点,本函数只接受一个参数! import nump ...

  3. 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

    作者:阿里云用户mr_wid ,z)NKt#   @I6A9do   如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV   RsfTUb)<   投票标题:  28.[阿里云 ...

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

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

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

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

  6. 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限

    2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...

  7. 2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践

    2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践 --------CONTENTS-------- 1. 免杀原理与实践说明 实验说明 基础问题回答 2. 使用msf ...

  8. 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图

    之前写过三篇文章,收获了极其不错的阅读量与转发量: 你真的会用 VS Code 的 Ctrl.Shift和Alt吗?高效易用的快捷键:多光标.跳转引用等轻松搞定 VS Code 中的 Vim 操作 | ...

  9. 大数据存储:MongoDB实战指南——常见问题解答

    锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...

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

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

随机推荐

  1. mongodb logical sessions can't have multiple authenticated users

    前言 使用 mongodb db.auth,切换用户时,报以下错误 logical sessions can't have multiple authenticated users 原因是 mongo ...

  2. MongoDB 简单介绍

    MongoDB介绍 疑问 解答 什么是 MongoDB 一个以 JSON 为数据模型的文档数据库 为什么叫文档数据库? 文档来自于 "JSON Document",并非我们一般理解 ...

  3. js发送get 、post请求

    前言 我们经常会用到js发送网络请求,这里用到XMLHttpRequest,主要是为了考虑早期的IE.分为三步:创建需要的对象.连接和发送.接收. GET请求 var httpRequest = ne ...

  4. windows linux子系统(Ubuntu)ip地址

    在Windows10安装好了的子系统(Ubuntu)上,安装了nginx 想去访问,使用ipconfig .ip add,查询来的ip地址都跟自己Windows10的ip完全一样,难道Linux子系统 ...

  5. PKCS#系列规范分别规定了什么

    PKCS#1:定义了RSA公钥和私钥的表示方法,以及如何进行RSA加密和签名. PKCS#2:原本是用以规范RSA加密摘要的转换方式,现已被纳入PKCS#1之中. PKCS#3:规范以Diffie-H ...

  6. Python 加上颜色进行输出

    博客地址:https://www.cnblogs.com/zylyehuo/ print(f"\033[42m文本内容\033[0m")

  7. 独立博客与秘密基地,以及对UI设计中拟物态的怀念

    小时候的秘密基地 哪个人小的时候不想有一个"秘密基地"呢?后来人长大了,心里还有这个小欲望,想有一块属于自己的空间,可以自由装饰,可以藏喜欢的东西,不受社会道德约束,不受规则铁蹄践 ...

  8. Oracle return exit continue

    常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then ...

  9. 学习Django【2】把视图和路由连接起来的是URLconfigs的配置文件

    在view.py视图中定义: def detail(request, question_id): return HttpResponse("You're looking at questio ...

  10. cnpack导致view快捷键失灵。

    学习d10.3.出现怪问题: 卸载cnpack出现: 这下要用快捷键了.那可不烦透了. 如此就ok了. 鸡蛋好吃,还要知道母鸡如何生蛋的?