ToB企服应用市场:ToB评测及商务社交产业平台

标题: 『玩转Streamlit』--集成Matplotlib [打印本页]

作者: 徐锦洪    时间: 2024-12-17 21:20
标题: 『玩转Streamlit』--集成Matplotlib
Steamlit虽然也自带了一些绘图组件(比如折线图,柱状图和散点图等等),但是都比较简单,
和Python传统的可视化库比起来,功能上差了很多。
本篇介绍如何在Streamlit App中利用Matplotlib库来绘图。
1. st.pyplot函数

st.pyplot函数专门用于在Steamlit应用中显示 Matplotlib 绘制的图形。
这个函数能够直接将Matplotlib Figure对象直接渲染到页面的指定位置上。
st.pyplot的参数不多,主要有:
名称类型说明figFigure对象要渲染的 Matplotlib Figure 对象clear_figurebool控制图形渲染后是否打扫use_container_widthbool决定是否利用父容器的宽度覆盖图形的原始宽度最重要的就是fig参数,它是通过 Matplotlib 的通例绘图方式创建图形对象。
也就是说,我们绘制图形时,完全不消考虑Streamlit,正常利用Matplotlib来绘图,
绘制之后直接将Matplotlib的fig对象传给st.pyplot函数即可。
2. Matplotlib兼容性题目

在利用 Matplotlib 与 Streamlit 结合时,可能会碰到一些兼容性题目。
Matplotlib 支持多种 Backend,如果在利用过程中出现错误,可以尝试将Backend设置为TkAgg。
具体的设置方法如下:
如果是windows系统,上面的文件路径改为:C:\Users\%username%\.matplotlib\matplotlibrc
此外,Matplotlib 在多线程情况下可能会出现题目,因为它本身对线程的支持并不完善。
当部署和共享应用程序时,由于可能存在并发用户,这个题目可能会更加突出。
为了解决这个题目,建议利用RendererAgg.lock来包裹 Matplotlib 相关代码,如下所示:
  1. from matplotlib.backends.backend_agg import RendererAgg
  2. _lock = RendererAgg.lock
  3. with _lock:
  4.     fig.title('sample figure')
  5.     fig.plot([1,20,3,50])
  6.     st.pyplot(fig)
复制代码
3. 利用示例

下面通过两个根据实际情况简化的示例来演示两者结合的结果。
3.1. 模拟数据分析项目

这个示例中,我们利用 np.random 函数生成了包罗三列不同类型随机数据的 DataFrame。
在数据分析与可视化部分,根据选择的列举行不同类型的绘图操作,
本示例主要展示了 Streamlit 与 Matplotlib 结合在数据探索和分析可视化方面的便利性与交互性。
  1. import streamlit as st
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns
  5. import numpy as np
  6. import matplotlib
  7. # 为了显示中文
  8. matplotlib.rcParams["font.sans-serif"] = ["Microsoft YaHei Mono"]
  9. matplotlib.rcParams["axes.unicode_minus"] = False
  10. # 生成随机数据
  11. @st.cache_data
  12. def generate_data():
  13.     # 生成 100 行 3 列的随机数据
  14.     data = {
  15.         "Column1": np.random.randint(1, 100, 100),
  16.         "Column2": np.random.normal(50, 10, 100),
  17.         "Column3": np.random.choice(["A", "B", "C"], 100),
  18.     }
  19.     return pd.DataFrame(data)
  20. data = generate_data()
  21. # 数据探索部分
  22. st.subheader("数据探索")
  23. st.write(data.head())
  24. # 数据分析与可视化
  25. st.subheader("数据分析与可视化")
  26. # 选择分析的列
  27. selected_column = st.selectbox("选择要分析的列", data.columns)
  28. # 使用 Matplotlib 绘制柱状图
  29. if selected_column in ["Column1", "Column2"]:
  30.     fig, ax = plt.subplots()
  31.     if selected_column == "Column1":
  32.         sns.countplot(data=data, x=selected_column, ax=ax)
  33.     else:
  34.         sns.histplot(data=data, x=selected_column, kde=True, ax=ax)
  35.     ax.set_title(f"{selected_column} 分布情况")
  36.     ax.set_xlabel(selected_column)
  37.     ax.set_ylabel("数量")
  38.     st.pyplot(fig)
  39. # 绘制散点图(以 Column1 和 Column2 为例)
  40. elif selected_column == "Column3":
  41.     if st.checkbox("显示散点图"):
  42.         fig2, ax2 = plt.subplots()
  43.         ax2.scatter(data["Column1"], data["Column2"])
  44.         ax2.set_title("Column1 与 Column2 的关系")
  45.         ax2.set_xlabel("Column1")
  46.         ax2.set_ylabel("Column2")
  47.         st.pyplot(fig2)
复制代码
运行结果:

3.2. 模拟数据监控与报告

在这个数据监控与报告应用示例中,通过get_live_data 函数模拟获取实时数据(实际应用中可替换为真实的数据获取逻辑)。
然后通过一个循环,不断获取新数据并归并到总的数据会合,再利用 Matplotlib 绘制折线图展示数据随时间的变化趋势。
这样就构建了一个简单的实时数据监控应用,在实际业务场景中,例如监控服务器性能指标、生产线上的关键数据等,可以让相关职员实时直观地了解数据的变化情况,实时发现非常并做出决策。
  1. import streamlit as st
  2. import matplotlib.pyplot as plt
  3. import time
  4. import random
  5. import pandas as pd
  6. import matplotlib
  7. # 为了显示中文
  8. matplotlib.rcParams["font.sans-serif"] = ["Microsoft YaHei Mono"]
  9. matplotlib.rcParams["axes.unicode_minus"] = False
  10. # 模拟获取实时数据的函数
  11. def get_live_data():
  12.     # 这里可以替换为真实的获取数据逻辑,比如从数据库或 API 获取
  13.     new_data = pd.DataFrame(
  14.         {
  15.             "time": [time.strftime("%H:%M:%S")],
  16.             "value": [random.randint(-10, 10)],
  17.         }
  18.     )
  19.     return new_data
  20. # 初始化数据
  21. data = pd.DataFrame(columns=["time", "value"])
  22. # 实时数据监控应用标题
  23. st.title("实时数据监控")
  24. # 创建一个占位符用于更新图表
  25. chart_placeholder = st.empty()
  26. while True:
  27.     # 获取新数据
  28.     new_data = get_live_data()
  29.     # 合并新数据到总数据
  30.     data = pd.concat([data, new_data], ignore_index=True)
  31.     # 使用 Matplotlib 绘制折线图
  32.     fig, ax = plt.subplots()
  33.     ax.plot(data["time"], data["value"])
  34.     ax.set_title("实时数据趋势")
  35.     ax.set_xlabel("时间")
  36.     ax.set_ylabel("数值")
  37.     ax.set_xticklabels(data["time"], rotation=45)
  38.     # 在 Streamlit 中更新图表
  39.     chart_placeholder.pyplot(fig)
  40.     # 每隔一段时间更新数据(这里设置为 2 秒)
  41.     time.sleep(2)
复制代码
运行结果:

4. 总结

Streamlit 与 Matplotlib 结合的关键点在于,Streamlit 提供便捷的应用构建框架,Matplotlib 专注强大的绘图功能,二者通过 st.pyplot 函数紧密相连。
在数据处理流程上,可先在 Matplotlib 中依据数据特性灵活创建各类图形对象,再借助 Streamlit 整合进应用。
它们结合的优势也非常明显,起首,在可视化效率方面,能快速将 Matplotlib 绘制的图形嵌入 Streamlit 应用,减少开发时间与代码量。
其次,在交互性上,Streamlit 的丰富交互组件可与 Matplotlib 图形联动,如通过按钮、滑块等控制图形展示内容或范围,让用户更方便的举行数据探索。

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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4