不会 Web 开发,也能让数据“动”起来的开源项目!
本文面向有 Python 基础的小伙伴,有 Web 基础的更好

作者:HelloGitHub-吱吱
这里是 HelloGitHub 推出的《讲解开源项目》系列,今天要向小伙伴们介绍的是一个能够快速地把数据制作成可视化、交互页面的 Python 框架:Streamlit,分分钟让你的数据动起来!
犹记得在做机器学习和数据分析方面的毕设时,曾经为了制作精美的图表而抓耳挠腮,曾经为了在页面可视化、交互式展示数据而绞尽脑汁。现在摆在我们面前的是一个能够快速可视化数据并且制作成交互页面的 Python 框架,只需几分钟,就可以快速构建和部署功能强大的数据应用程序,写到这里 Streamlit 的高傲已经尽数体现了。
Streamlit - The fastest way to build and share data apps

下面我们就一起来上手这个强大的 Python 数据可视化框架吧!
一、浅尝辄止
1、本地实验环境:Python 3.6 - Python 3.8。
2、安装 Streamlit 体验官方提供的 hello world 小 demo。
pip install streamlit
streamlit hello

3、运行上述命令后会自动打开 Streamlit 的初始页面 http://localhost:8501/。

4、通过左边栏可以选择四个内置小项目并查看其代码,例如分形动画、折线图和层叠地图等,能在网页上点击选择设置一些参数,动态查看效果。


二、熟能生巧
通过 Streamlit 提供的接口,完美避开 Django 和 Flask 框架,无需编写 HTML、CSS、JavaScript 代码,与魔幻的前端 say goodbye。
2.1 开发自己的 app
1、首先创建一个 Python 文件,命名为 test.py,导入 Streamlit 库。
import streamlit as st
2、通过如下命令启动项目,Ctrl + c 即可结束项目。
# filename 自己的 py 文件名称
streamlit run [filename]

3、当应用程序正在运行时,每次修改 Python 文件并保存,网页都会弹出提示“Source file changed”,可以选择“Rerun”或者“Always rerun”,使得页面能够重新刷新。忽略掉小小的等待时间,我们能够在快速交互循环中「所见即所得」。
4、我们在任何时候对网页内容进行更新,包括:修改源码、使用者和网页进行交互(点击网页的按钮、输入文本),Streamlit 都是自上而下扫描解析并且运行整个代码。
2.2 基础命令
2.2.1 显示文本
| 命令 | 效果 |
|---|---|
st.title() |
添加一个标题 |
st.write() |
Streamlit 的瑞士军刀,可渲染如文本、Matplotlib 和 Altair 图表等几乎任何数据参数 |
st.text() |
显示纯文本 |
st.header()、st.subheader() |
二级标题和三级标题 |
st.markdown() |
显示 Markdown |
st.latex() |
显示格式为 LaTeX 的数学表达式 |
st.code() |
显示带有可选语法高亮显示的代码块 |

2.2.2「魔法」
我愿称之为懒人命令——用尽量少的代码达到同样的效果。在不调用任何 Streamlit 方法的情况下,当用户自定义的变量出现在单行中,等同于 st.write() 效果。
import pandas as pd
df = pd.DataFrame({
'first column': [1, 2, 3, 4],
'second column': [10, 20, 30, 40]
})
df

也可以将 ''' 和 ' 包裹的内容直接显示。
# Draw a title and some text to the app:
'''
# Welcome to HelloGitHub
_快来加入我们吧_
'''
x = 10
'x', x # <-- Draw the string 'x' and then the value of x

2.2.3 显示数据表
Streamlit 能从多个不同角度快速、交互地可视化数据,原始数据、图表、JSON 数据等皆可。
| 命令 | 效果 |
|---|---|
st.dataframe() |
将数据框显示为交互式表格 |
st.table() |
显示静态表格 |
st.json() |
将对象或字符串显示为 JSON 字符串 |

2.2.4 绘制图表和地图
Streamlit 支持多种流行的数据图表库,如 Matplotlib、Altair、deck.gl 等。
| 命令 | 效果 |
|---|---|
st.line_chart() |
折线图 |
st.area_chart() |
面积图 |
st.bar_chart() |
条形图 |
st.map() |
在地图上显示数据点 |
st.pyplot() |
matplotlib.pyplot 图表 |
st.altair_chart() |
使用 Altair 库显示图表 |
st.vega_lite_chart() |
使用 vega_lite_chart 库显示图表 |
st.pydeck_chart() |
使用 PyDeck 库绘制图表 |

2.2.5 显示多媒体
动动鼠标即可将图像、视频和音频文件直接嵌入 Streamlit 应用程序。
| 命令 | 效果 |
|---|---|
st.image() |
图片 |
st.audio() |
音频 |
st.video() |
视频 |

2.2.6 交互式小部件
盯:漂亮的按钮、滑块、输入框等小部件。每次用户与小部件交互时,Python 脚本都会重新执行,并且该小部件的输出值会在运行期间设置为新值。
1、按钮 button。
if st.button('HelloGitHub'):
st.write('Subscribe our channels~')

2、复选框 checkbox。
ret = st.checkbox('I love HelloGitHub!')
if ret:
st.write('Me too~')

3、滑块 slider,可以选择 int / float / data / time / datetime 等类型。
age = st.slider('HelloGitHub 几岁了?', 0, 10, 1)
st.write("HelloGitHub ", age, ' 岁了~')

4、常用的命令列举
| 命令 | 效果 |
|---|---|
st.radio() |
单选按钮 |
st.select() |
单选框 |
st.multiselect() |
多选框 |
st.text_input() |
单行文本输入框 |
st.text_area() |
多行文本输入框 |
st.number_input() |
数字输入框 |
st.date_input() |
日期输入框 |
st.time_input() |
时间输入框 |
st.file_uploader() |
文件上传 |
st.color_picker() |
取色器 |
2.2.7 显示进程和状态
1、进度条 progress。
import time
my_bar = st.progress(0)
for percent_complete in range(100):
time.sleep(0.1)
my_bar.progress(percent_complete + 1)

2、spinner:在执行代码块时临时显示一条消息。
import time
with st.spinner('Wait for it...'):
time.sleep(5)
st.success('Done!')
st.balloons()

3、其他
| 命令 | 效果 |
|---|---|
st.balloons() |
庆祝气球 |
st.error() / st.warning() / st.info() / st.success() / st.exception() |
错误、警告、提示、成功、报错信息提示 |
2.2.8 性能优化

Streamlit 使用 @st.cache 装饰器使得页面能够快速“无痕”刷新。当我们给函数打上 cache 标记时,Streamlit 在碰到该函数的时候会检查三个值:函数名称、函数体、输入参数。如果发现这三个值的组合第一次出现,则会运行函数,并且将结果存储在本地缓存中。当下次调用该函数时,如果这三个值没有改变,则 Streamlit 会跳过函数执行,直接读取本地缓存返回结果。
@st.cache
def HelloGitHub(url):
# 返回相应数据
return data
# 第一次遇到,执行该函数
d1 = HelloGitHub(DATA_URL_1)
# 传入参数一致,第二次遇到不会执行该函数
# 而会直接返回前一次计算的结果,d1 = d2
d2 = HelloGitHub(DATA_URL_1)
# 传入参数不同,重新执行该函数
d3 = HelloGitHub(DATA_URL_2)
2.2.9 布局设置
1、将交互小部件放入侧边栏。
add_selectbox = st.sidebar.selectbox(
"Which one?",
("C++", "Java", "Python")
)

2、表单 st.form():将元素与“提交”按钮一起处理。
# 向表单插入元素
with st.form("my_form1"):
st.write("我在 1 框框里~")
slider_val = st.slider("框框滑块")
checkbox_val = st.checkbox("pick me")
# Every form must have a submit button.
submitted = st.form_submit_button("1-Submit")
# 乱序插入元素
form = st.form("my_form2")
form.slider("我在 2 框框里~")
st.slider("我在外面")
# Now add a submit button to the form:
form.form_submit_button("2-Submit")

3、插入列并排的容器
# 官方示例
col1, col2, col3 = st.beta_columns(3)
with col1:
st.header("A cat")
st.image("https://static.streamlit.io/examples/cat.jpg")
with col2:
st.header("A dog")
st.image("https://static.streamlit.io/examples/dog.jpg")
with col3:
st.header("An owl")
st.image("https://static.streamlit.io/examples/owl.jpg")
2.3 修改配置
1、查看所有的配置选项:streamlit config show。
2、Windows 系统可以在 %userprofile%/.streamlit/config.toml 全局文件下或者在当前运行 Streamlit 的文件夹下建立 .streamlit/config.toml 文件进行设置。
3、某些配置例如外观、主题等点击网页上的 Settings 也可轻松选择。

2.4 在 Streamlit sharing 上部署、管理和共享
1、将自己的项目代码上传到 GitHub 的共有仓库,添加需求文件以管理任何外部依赖项,例如 requirements.txt 等。
2、在 https://streamlit.io/sharing 上注册账号并且申请邀请「Request an invite!」。收到邀请电子邮件后,即可使用该平台部署管理。
3、选择 New app 在 Deploy an app 中填入相应信息即可。

4、若应用程序有很多依赖项,则第一次部署可能需要一些时间,最终应用程序可以使用如下链接访问:
https://share.streamlit.io/[user name]/[repo name]/[branch name]/[app path]
三、精益求精
到此,Streamlit 框架的基本接口和用法都已经讲完啦!更多详情还需要友友们在实践中探索,并将指令成功“嵌入”到自己的项目中。
很多命令在文档的「API cheat sheet」中都可以快速搜索到,希望很快就能够在 Streamlit Gallery 上看到大家分享的应用,可以留言给我地址我会去把玩的~。
最后,您的关注和点赞是对我们 HelloGitHub 莫大的支持,我们将会为您源源不断推送新鲜、有趣的开源项目。
关注 HelloGitHub 公众号 第一时间收到更新。
还有更多开源项目的介绍和宝藏项目等待你的发现。
不会 Web 开发,也能让数据“动”起来的开源项目!的更多相关文章
- Solon Web 开发,五、数据访问、事务与缓存应用
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- 不想加班开发管理后台了,试试这个 Java 开源项目吧!
本文适合有 Java 基础并了解 SpringBoot 框架的同学 本文作者:HelloGitHub-嘉文 这里是 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款开 ...
- python web开发-flask访问请求数据request
Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#fla ...
- web开发网络请求到数据的整合办法
开发中向服务器请求到的数据是特别复杂的,需要从中抽离出需要展示的数据进行展示个和交互. 思路: 先将请求到的复杂数据传递到一个类A中,从类A里抽离出需要的数据.需要展示数据的地方,面向类A开发,类A关 ...
- java web开发入门十二(idea创建maven SSM项目需要解决的问题)基于intellig idea(2019-11-09 11:23)
一.spring mvc action返回string带双引号问题 解决方法: 在springmvc.xml中添加字符串解析器 <!-- 注册string和json解析适配器 --> &l ...
- Web开发利器Webstorm导入多个文件夹或者项目
步骤:File->Setting 打开设置面板,打开Directories节点,然后看到有Add Content Root 操作选项,单击弹出磁盘目录文件,选择对应项目或者目录即可.
- java web开发入门九(Maven使用&idea创建maven项目)基于intellig idea
Maven 1.解决的问题 jar包的依赖和管理:版本.依赖关系等 自动构建项目 2.maven介绍 1.Maven是什么? Apache Maven是一个软件项目管理的综合工具.基于项目对象模型(P ...
- PyTorch大更新!谷歌出手帮助开发,正式支持TensorBoard | 附5大开源项目
大家又少了一个用TensorFlow的理由. 在一年一度的开发者大会F8上,Facebook放出PyTorch的1.1版本,直指TensorFlow"腹地". 不仅宣布支持Tens ...
- 【搭建开发环境】在 Windows XP 中参与开源项目,搭建 git 和 cygwin 开发环境
引言 只有一台 Windows XP 家用机,却想在诸如 Git@OSC 之类的开源社区参与开发,本文提供一个入门级的开发环境搭建指引. 涉及工具:Eclipse,EGit,Cygwin. 欢迎来到 ...
随机推荐
- 巧用SQL拼接语句
前言: 在日常数据库运维过程中,可能经常会用到各种拼接语句,巧用拼接SQL可以让我们的工作方便很多,达到事半功倍的效果.本篇文章将会分享几个日常会用到的SQL拼接案例,类似的SQL还可以举一反三,探索 ...
- Journey to the future begins
当提交申请的那一刻,我就更加确认了自己想要走的路,慢慢一路向上,追求自己想要的生活! 2021.5.18 wzb
- [java] XML DTD XSD
XML是用来干什么的 https://bbs.csdn.net/topics/120762 https://blog.csdn.net/Rain722/article/details/52925828 ...
- [Linux] Linux C编程一站式学习 Part.1
C语言入门 程序基本概念 程序和编程语言 C语言--(编译器)--汇编语言--(汇编器)--机器语言(目标代码 / 可执行代码) 可移植 / 平台无关:平台指计算机体系结构或操作系统,或二者的组合.不 ...
- linux 视频输出xrandr设置命令
linux 视频输出xrandr设置命令 沈祥佑关注 0.592019.03.28 17:44:09字数 397阅读 6,886 xrandr 不带参数的xrandr 命令会列出系统支持的视频接口名称 ...
- mysql基础之mariadb概念
一.数据库介绍 什么是数据库(Database)? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库 ...
- JDK、JRE 和 JVM 的区别
JDK JDK 是 Java Development Kit 的缩写,JDK 是 Java 语言的软件开发工具包( SDK ).它提供了Java 开发.编译.运行需要的文件和环境. 如果你是 Java ...
- 3*060-A 日志记录
电路检修遇到的问题: 今天在检修一块3060-A电路板时 发现 3.3V烫 但是3.3V路上的电容并没有短路 于是拆单片机 拆RS232EN 拆 FM24V 最后发现 原来是 1117 ...
- 9.10 nohup:用户退出系统进程继续工作
nohup命令 可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端. 无论是否将nohup命令的输出重定向到终端,输出都将写入到当前目录的nohup.out文件 ...
- 关于C语言的指针数组与指针数组的个人理解
一.指针数组与指针数组 1,指针数组 顾名思义,即一个元素全部是指针的数组,其形式与普通数组相似,形式如 *a[N]. 在理解指针数组的使用方式前,我先来说下我个人对数组的理解. 比如一维整形数组(形 ...