『玩转Streamlit』--集成Plotly

打印 上一主题 下一主题

主题 439|帖子 439|积分 1317

之前介绍了怎样在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_dataFigure或Data对象themestr指定图表的主题use_container_widthbool决定是否使用父容器的宽度覆盖图形的原始宽度keystr为元素提供标识on_selectstr控制图表怎样响应用户选择变乱selection_modestr图表的选择模式因为Plotly绘制的图形可交互,通过key参数,在交互的过程中,我们可以准确地定位到交互的图表。
on_select参数有以下几种取值:

  • ignore:不对图表中的任何选择变乱做出反应
  • rerun:在图表中选择数据时,会重新运行应用程序
  • 可调用对象****:会重新运行应用程序,并在应用程序的其余部门之前执行该可调用对象作为回调函数
selection_mode参数定义图表的选择模式,包括:

  • points:答应基于单个数据点举行选择
  • box:答应基于矩形区域举行选择
  • lasso:答应基于自由绘制区域举行选择
on_select不同时,页面的效果如下:
1.1. on_select=ignore

ignore是on_select的默认值,此时Plotly图形上无法选择对象。
  1. import streamlit as st
  2. import plotly.express as px
  3. df = px.data.iris()
  4. fig = px.scatter(df, x="sepal_width", y="sepal_length")
  5. st.plotly_chart(fig, key="iris")
  6. # 或者
  7. # st.plotly_chart(fig, key="iris", on_select="ignore")
复制代码

此时,工具栏上没有选择数据的小工具。
1.2. on_select=rerun

此时,st.plotly_chart会将选择的数据点返回。
选择数据点时,可以切换成矩形选择自由区域选择。
  1. event = st.plotly_chart(fig, key="iris", on_select="rerun")
  2. event
复制代码

1.3. on_select=callable

on_select=callable的效果on_select=rerun差不多,也能对数据点选择并得到选择的数据点。
不同之处在于,可以在选择数据点之后,调用callable函数举行额外的处理惩罚。
  1. def handle_selection():
  2.     from datetime import datetime
  3.     st.write(f"Selected data at {datetime.now()}")
  4. event = st.plotly_chart(fig, key="iris", on_select=handle_selection)
  5. event
复制代码

每次选择数据之后,上面的时间都会变革,说明handle_selection函数在每次选择数据之后都被回调。
2. 使用示例

下面通过示例演示实际场景中怎样使用streamlit和Poltly图表。
2.1. 销售数据时间序列分析

在这个示例中,首先创建了一个模仿的销售数据时间序列,然后通过st.plotly_chart展示图表,并设置on_select回调函数来处理惩罚用户在图表上的选择操纵。
当用户选择图上的点时,会在 Streamlit 应用中显示所选数据点对应的日期和销售额信息。
  1. import streamlit as st
  2. import plotly.express as px
  3. import pandas as pd
  4. # 模拟销售数据
  5. data = {
  6.     "Date": pd.date_range(start="2024-01-01", periods=100),
  7.     "Sales": [i**2 + 50 + 10 * (i % 10) for i in range(100)],
  8. }
  9. df = pd.DataFrame(data)
  10. # 创建时间序列折线图
  11. fig = px.scatter(df, x="Date", y="Sales")
  12. # 显示图表并处理选择事件
  13. def handle_selection():
  14.     selected_points = st.session_state["sales_chart"].selection.points
  15.     st.write("已选择的数据点:")
  16.     df = pd.DataFrame(columns=["日期", "销售额"])
  17.     for idx, p in enumerate(selected_points):
  18.         df.loc[idx, "日期"] = p["x"]
  19.         df.loc[idx, "销售额"] = p["y"]
  20.     st.dataframe(df)
  21. st.plotly_chart(fig, key="sales_chart", on_select=handle_selection)
复制代码

2.2. 模仿股票分析

使用generate_stock_data函数生成模仿的股票数据,再使用plotly.graph_objects创建一个烛台图,将模仿数据绘制到图表中。
编写一个回调函数,当用户在图表上选择某个点时,它会获取所选点的详细信息并在 Streamlit 应用中展示出来。
  1. import streamlit as st
  2. import plotly.graph_objects as go
  3. import pandas as pd
  4. import numpy as np
  5. # 生成随机模拟的股票数据
  6. def generate_stock_data(days=300):
  7.     dates = pd.date_range(start="2024-01-01", periods=days)
  8.     open_prices = np.random.rand(days) * 100 + 50
  9.     high_prices = open_prices + np.random.rand(days) * 10
  10.     low_prices = open_prices - np.random.rand(days) * 10
  11.     close_prices = open_prices + np.random.randn(days) * 5
  12.     data = {
  13.         "Date": dates,
  14.         "Open": open_prices,
  15.         "High": high_prices,
  16.         "Low": low_prices,
  17.         "Close": close_prices,
  18.     }
  19.     return pd.DataFrame(data)
  20. # 生成模拟股票数据
  21. df = generate_stock_data()
  22. # 创建交互式图表
  23. fig = go.Figure(
  24.     data=[
  25.         go.Candlestick(
  26.             x=df["Date"],
  27.             open=df["Open"],
  28.             high=df["High"],
  29.             low=df["Low"],
  30.             close=df["Close"],
  31.         )
  32.     ]
  33. )
  34. fig.update_layout(title="模拟股票价格", xaxis_title="Date", yaxis_title="Price")
  35. # onselect 回调函数
  36. def handle_selection():
  37.     selected_points = st.session_state.stock_chart.selection.points
  38.     st.write("Selected Stock Data Points:")
  39.     df = pd.DataFrame(columns=["日期", "开盘价", "收盘价", "最高价", "最低价"])
  40.     for idx, p in enumerate(selected_points):
  41.         print(idx, p)
  42.         df.loc[idx, "日期"] = p["x"]
  43.         df.loc[idx, "开盘价"] = p["open"]
  44.         df.loc[idx, "收盘价"] = p["close"]
  45.         df.loc[idx, "最高价"] = p["high"]
  46.         df.loc[idx, "最低价"] = p["low"]
  47.     st.dataframe(df)
  48. # 显示图表
  49. st.plotly_chart(fig, key="stock_chart", on_select=handle_selection)
复制代码

3. 总结

Streamlit 可以简化 Web 应用构建流程,Plotly 提供丰富图表类型,二者结合能快速将数据转化为交互式可视化应用,节省开辟时间。
别的,Plotly 图表交互性高,在 Streamlit 应用中可实现数据探索、筛选等操纵,增强用户体验。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表