使用 Python 进行数据可视化的最佳实践。如:
Streamlit:机器学习过程快速 web 可视化的工具,纯 Python 开发 web app。牛*tensorboard:交互性不如 Streamlit,OUT
pyecharts:基于百度开源的数据可视化工具库 echarts。原 js 的 Python 接口。适合数据工程 demo 展示streamlit-echarts:两大神器的合体Altair:让数据科学家更多地关注数据本身和其内在联系的库matplotlib:2D 绘图库,Python 可视化最基本、最常用的库。偏向学术(不够好看),但大家用得多,得会基本操作wordcloud:以词云为对象,依据词语出现的频率绘制词云,可设定词云的大小、颜色、形状等mapbox:处理地理数据引擎更强的可视化工具库Geoplotlib:地图可视化
概述
数据可视化库
Matplotlib:元老级,使用广泛,Python 可视化最基本、最常用的库。设计与 MATLAB 相似,偏向学术(不够好看),OUT
Seaborn:基于 Matplotlib 的高级可视化效果库,几行代码创建漂亮的图表偏向统计作图,即 Matplolib 的包装,OUT
Pyecharts:【当前首选】国产,生成 Echarts 图表,效果美观
Bokeh:交互式 web 可视化库,基于图像语法,可方便地将数据输出为 JSON 对象、HTML 文档或交互式 Web 应用程序,支持流媒体和实时数据。
- 基于 Javascript 的交互可视化库,python 画图保存为 html。坑多,语法晦涩难懂。OUT
Plotly:数据可视化的在线平台,与 Bokeh 一样,Plotly 的强项在于制作交互式图,但它提供了一些在大多数库中没有的图表,如等高线图、树状图和 3D 图表。
- 配色好看,底层为 plotly.js,是基于 D3.js、stack.gl 和 SVG,以 JavaScript 在网页上实现图形展示功能。很强大,也很复杂。有 freemium 与 premium 两种帐户,不,我要全功能,不行?OUT。
- plotly 是很强,但是接口设计和文档的真的是反人类
Altair 是一个基于 Vega-lite 的声明性统计可视化库,声明意味着用户只需要提供数据列与编码通道之间的链接,例如,x轴、y轴、颜色等,其余的绘图细节它会自动处理,声明使 Altair 变得简单、友好和一致,用户使用 Altair 可以轻松设计出有效且美观的可视化代码。
- OUT:没有饼图?这种基本的图都没有,怀疑它的靠谱性。
数据可视化流程
确定目标,选择图形
- 可视化的目的:更清晰地反映数据的某个特征,使分析、评估变得清晰。
- 数据大屏样式:flex 布局 + echarts + UI 组件 + 相关 css/js 效果
- 点: scatter plot:二维数据,适用于简单二维关系; ^d227a3
- 线: line plot:二维数据,适用于时间序列;
- 柱状: bar plot: 二维数据,适用于类别统计;
- 颜色: heatmap:适用于展示第三维度
提炼数据,构建关系
- 数据指标
- 关系:分布、构成、比较、联系、变化
- 用户关注的重点指标
- 避免数据中的极端值,异常值,或过多的分类等
- 数据
- 合并: merge,concat,combine_frist(类似于数据库中的全外连接)
- 重塑: reshape;轴向旋转:pivot(类似 excel 数据透视表)
- **去重:**drop_duplicates
- **映射:**map
- **填充替换:**fillna,replace
- **重命名轴索引:**rename
图表选择
- 由数据间的相互关系确定图表
- 选择最合适的图表来可视化,切记不要炫技,可视化的目的是简洁明了,突出主题。
- 趋势型:某一变量随另一变量的变化趋势,如时间序列数据的可视化;
- 折线图:数据在一个连续时间间隔上的变化。连续数值的变化趋势
- 柱状图
- 箱线图:五个数字表示:最大值,最小值,中位数,下四分位数、上四分位数
- 对比型:对比两组或两组以上的数据,如班级的男女生数量比较
- 条形图(柱状图):用垂直或水平的柱子显示类别之间的数值比较。多个分类的
- 比例型:数据总体和各个组成部分之间的比例关系。
- 饼图:以弧度大小表示不同分类的占比。一般不超过九个分类
- 相关性分析:商品的单价与销售量的关系
- 散点图 (X-Y 图):将所有数据以点的形式展现在直角坐标系上。
- 分布型:展现一组数据的分布情况,如描述性统计中的集中趋势、离散趋势、偏态与峰度等。
- 常采用直方图
- 区间型:显示同一维度上值的不同分区差异,常用来表示进度情况
- 仪表盘图:拟物化(汽车速度表)图表,刻度表示度量,指针不示维度,指针角度表示数值
- 关联型:用于直观表示不同数据之间的相互关系,如包含关系、层级关系、分流关系、联结关系等
- 漏斗转化分析:分析具有明确流程节点转化率的资料分析场景,如浏览商品到下单
- 漏斗图
- 地理型:数据在不同地理区域上的分布情况,如 各省的人口数量。
- 点地图、区域地图、热力地图、流向地图等
- 热力图:Heat Map:以彩虹色系展现分布的
- 日历图:分析与时间规律相关的分布数据。如 Github
- 分布分析:不同产品类型的销售金额
- 饼图、堆积柱状图
- 周期性数据分析:如企业经营状况:收益性\生产性、流动性、安全性等 。
- 快速对比、定位短板指标
- 雷达图:表示多维数据的图表,每个维度数据对应一个坐标轴。
可视化布局
- 针对多个可视化图表,进行各区域的布局设计:
- 聚焦:凸显主体(重要数据),吸引用户,提高效率
- 平衡:合理利用空间,保持元素间的空间平衡,提高设计美感
- 简洁:突出重点,避免冗余
- 图表形状,颜色,边框,背景,网格等辅助元素,一定程度上可以帮助用户聚焦,但使用过当的情况下会使得图表杂乱,视觉上不够聚焦,影响观看
Streamlit
Streamlit:机器学习过程快速 web 可视化的工具,纯 Python 开发 web app。牛*
tensorboard:交互性不如 Streamlit,OUTanvil:出现了一个功能比 Streamlit 强得多,能真正替换掉 flask 的东西,但它只能在 web 上 code,以及有些功能需收费,以及功能看起来好复杂,观望中【202107】Pynecone:需要 nodejs?OUT
类似插件的库
-streamlit-elements:一堆功能,有个可拖拽的元素不错
- 特点:
- 组件机制:组件为变量,Streamlit 没有回调,每次交互都是简单的返回,以保证代码的干净
- 一改一执行:自上而下运行,每次改变网页中的某个控件的值 a 或修改源代码 时,都会重新执行脚本。
- 实时看效果:开发速度快,修改方便,监视每次修改,实进更新效果
- 数据重用:缓存机制,对于机器学习导入的大规模数据集,在热更新中不必重复加载数据。
- No 前端:不需要 web 相关的 css、js,**JS
- 缺点:前端界面固定,不能随意调整控件位置,待发展(目前基本够用)
- 参考资料:官方文档
- 2021 年 10 月 5 日,发布了 1.0.0 版本
基本使用
- 默认端口 8501,被占用时会递增
1 | pip install streamlit |
1 | 运行官方示例 demo |
1 | 修改端口 |
1 | import streamlit as st |
配置
1 | st.set_page_config( |
.streamlit/config.toml
1 | [server] |
会话状态
- 重运行(rerun)间共享变量
- session state 只可能在应用初始化时被整体重置。而 rerun 不会重置 session state。可以理解成“状态缓存”。
- 如存储登录状态(通过回调函数将 False 变 True)
1 | 对每个用户会话,会话状态是在重新运行之间共享变量的一种方式 |
带参数访问
1 | st.experimental_get_query_params() |
自定义组件
- 可以使用
streamlit.components.v1.html或streamlit.components.v1.iframe来使用 HTML 的相关资源,but,不这么做,因为就是为了不用 HTML 才用的 Streamlit
常用控件
文本控件
1 | # 标题,anchor不设置则会用body生成 |
数据控件
1 | # 指标 |
图表控件
- Matplotlib、Altair, deck.gl 等
优先使用 altair,altair 也不太行,最终选择了 streamlit-pyecharts
1 | # Altair 图表 |
1 | # 折线图 |
交互控件
1 | # 按钮 button |
媒体
1 | # numpy_array, audio_bytes, file |
布局与容器
1 | # 侧边栏 |
进度与状态
1 | # 实时显示状态 |
控制流 - 表单
1 | # 后面的语句将不会运行,常在 st.warning('...')后使用 |
源代码
1 | # 在运行的上方输出其源代码 |
性能
cache_data
如果这是 Streamlit 第一次看到这些参数值和函数代码,它将运行函数并将返回值存储在缓存中。下次使用相同的参数和代码调用函数时(例如,当用户与应用程序交互时),Streamlit 将完全跳过执行函数并返回缓存的值。在开发过程中,缓存会随着函数代码的更改而自动更新,从而确保最新的更改反映在缓存中。
如前所述,有两个缓存装饰器:
st.cache_data是缓存返回数据的计算的推荐方法:从 CSV 加载数据帧、转换 NumPy 数组、查询 API 或任何其他返回可序列化数据对象(str、int、float、DataFrame、array、list 等)的函数。它在每次函数调用时都会创建数据的新副本,使其免受 突变和竞争条件 的影响。在大多数情况下,的行为是您想要的 - 所以如果您不确定,请从开始,看看它是否有效!st.cache_data``st.cache_datast.cache_resource是缓存全局资源(如 ML 模型或数据库连接)的推荐方法 - 您不想多次加载的不可序列化对象。使用它,您可以在应用的所有重新运行和会话之间共享这些资源,而无需复制或复制。请注意,对缓存返回值的任何更改都会直接改变缓存中的对象(更多详细信息见下文)。
缓存 -cache
- 缓存可让 Streamlit 避免重复请求数据或重复计算,用于快速热更新服务,使用装饰器声明来实现。
- 缓存会在第一次执行该函数时将结果存入缓存,若第二次被调用时以下三项未改变,会直接从缓存中取结果
- 函数的输入参数
- 函数依赖的外部变量、代码(函数)、文件等
- 功能主体(构成函数主体的实际字节码)、输出
- 目前还存在一定的局限,如:
- 只检查当前工作目录的更改,若调用的第三方库改了代码,不会有反应。
- 如果函数接收的数据是个实时返回的接口,例如股票,天气这类数据,那么 Streamlit 的缓存机制是不知道你的数据是否发生了变化
- 另外,不要去更改缓存函数的输出,因为缓存的值是按引用存储的。
1 |
|
experimental_memo
用于记忆函数执行的实验性函数装饰器
- 返回计算的数据帧(pandas、numpy)、缓存下载的数据
1 | # 用于记忆大型数据 |
experimental_singleton
用于存储单例对象的实验函数装饰器
- 通过引用返回项目,可返回任何对象类型。
- 用于 Pytorch 加载的模型、数据库连接
- 连接到应用程序的每个用户都可以同时使用单例对象,有必要确保 st.singleton 对象是线程安全的。
1 | st.singleton( |
组合技
文件下载
1 | # but,st.markdown 有最大 50MB 的限制 |
按钮显示不同页面
1 | import streamlit as st |
打包成 exe
- pynsist:
- 会生成的是一个安装文件
- 安装较慢
- 运行无界面,运行还是失败了,8501 进不去
- OUT
- http://nsis.sourceforge.net/Download
遇到的问题
- 问题:AttributeError: module ‘plotly.graph_objs.layout.template.data’ has no attribute ‘Icicle’
- 解决方案:安装 5.+ 版本的 pandas
1 | AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key' |
- st.markdown 会将路径中的下划线解释为语法
1 | st.markdown('./test/__aa__.py') # aa 会加粗,不过这不是 bug |
- 出现 AttributeError: module ‘typing‘ has no attribute ‘_ClassVar‘错误
1 | pip uninstall dataclasses |
PermissionError: [Errno 13] Permission denied: ‘/root/.streamlit’
主要原因在于启动时使用了错误的权限
- 问题:failed to process a websocket message(RangeError:index out of range: 58+ 10>58)
- 解决方案:因为多个交互或多个运行在打架,重启程序试试
- 问题:
streamlit-pages
streamlit-pages:用于方便的制作 st 的多页效果
1 | pip install streamlit-pages |
1 | import streamlit as st |
pyecharts
pyecharts:基于百度开源的数据可视化工具库 echarts。原 js 的 Python 接口。适合数据工程 demo 展示
- 好用 + 好看:API语法简单,效果出众,基于 canvas 与 WebGL,高度定制图表类型与动态效果。
- 3D 图表、地图、日历、微信小程序版本等 30+ 的常用图表
- 400+ 的地图文件 + 原生的百度地图,地理数据可视化
- 轻松集成到 web 框架
- 文档详细
- 简洁的 API 设计,使用如丝滑般流畅,支持链式调用
- 囊括了 30+ 种常见图表,应有尽有
- 支持主流 Notebook 环境,Jupyter Notebook 和 JupyterLab
- 可轻松集成至 Flask,Sanic,Django 等主流 Web 框架
- 高度灵活的配置项,可轻松搭配出精美的图表
- 详细的文档和示例,帮助开发者更快的上手项目
- 多达 400+ 地图文件,并且支持原生百度地图,为地理数据可视化提供强有力的支持
Pyecharts 是我国开发人员开发的,相比较 Matplotlib、Seaborn 等可视化库,Pyecharts 十分符合国内用户的使用习惯。
Pyecharts 的目的是实现 Echarts 与 Python 的对接,以便在 Python 中使用 Echarts 生成图表。
Echarts 是百度开源的一个数据可视化 JavaScript 库,生成的图的可视化效果非常好,其凭借良好的交互性,精巧的图表设计,得到了众多开发者的认可
特点
- 词云、地图等
配置
1 | pip install pyecharts |
主题
1 | from pyecharts.globals import ThemeType |
1 | from pyecharts.charts import Bar |
1 | from pyecharts.charts import Bar |
1 | from pyecharts import Bar |
折线图
1 |
|
柱状图
1 |
|
地图
1 | from pyecharts import options as opts |
streamlit-echarts
streamlit-echarts:两大神器的合体
1 | pip install streamlit-echarts |
基本使用
- 参考文档
- st_echarts: 加载使用 python dict 表示的 json 形式的 echarts options
- st_pyecharts
1 | st_echarts( |
1 | from streamlit_echarts import st_echarts |
1 | from pyecharts import options as opts |
streamlit-aggrid
streamlit-aggrid:增强的表格
streamlit-ace
streamlit-ace:增强的编辑器
1 | pip install streamlit-ace |
1 | import streamlit as st |
streamlit-image-comparison
streamlit-image-comparison:图像比较
1 | pip install streamlit-image-comparison |
1 | # Streamlit Image-Comparison Component Example |
streamlit-chat
st-chat:Chat-bot UI
1 | pip install streamlit-chat |
1 | import streamlit as st |
streamlit-lottie
Streamlit-lottie:Streamlit 中运行动画效果
Altair
Altair:让数据科学家更多地关注数据本身和其内在联系的库
- 参考文档:官方文档
- 特点:
- 上手快、接口简单、使用优雅
- 基于 Vega 和 Vega-Lite,
- 流程:
- 准备数据
- pd.DataFrame:优先使用
- altair.Data:altair 自己的数据对象
- 指向 json 或 csv 格式文件的 url:即可获取网上的在线数据
- 一个支持
geo_interface接口的对象,如 Geopandas.GeoDataFrame
- 使用数据创建图表:
- 设置图表类型:折线图、散点图还是什么图
- 对图像进行编码:什么轴显示什么数据
- 准备数据
- 三大思想
- data: 数据,数据集
- mark: 标记,表示数据点的形状,如实心点、空心点、方块等
- encode: 编码
- x:x 轴数值
- y:y 轴数值
- color:标记点颜色
- opacity:标记点的透明度
- shape:标记点的形状
- size:标记点的大小
- row:按行分列图片
- column:按列分列图片
基本使用
1 | pip install altair vega_datasets |
1 | import altair as alt |
1 | df_data=pd.DataFrame({ |
matplotlib
matplotlib:2D 绘图库,Python 可视化最基本、最常用的库。偏向学术(不够好看),但大家用得多,得会基本操作
1 | import matplotlib.pyplot as plt |
1 | plt.imshow() # 对图像进行处理 |
1 | import matplotlib.pyplot as plt |
1 | # 折线图 |
中文字体
1 | import numpy as np |
配置
matplotlib 中文
在 shell 的配置中重新设置配置变量(bash的话设置文件 .bashrc,zsh则设置文件 .zshrc)。方法是末尾添加:
1 | export PYTHONIOENCODING="utf8" |
1 | import matplotlib as mpl |
中文显示问题
- 方法一
1 | from pylab import mpl |
- 方法二
- 删除原本 Matplotlib 字体的缓存
- 在 terminal 中使用以下命令(不同 Python 版本 cache 会有些不同)
1 | rm ~/.matplotlib/fontList.py3k.cache |
- 重启(restart)Jupiter Notebook,并指定 Matplotlib 使用我们安装的字体
1 | import matplotlib.pyplot as plt |
dash
dash:开发 web 应用的高生产率工具率,基于 Flask、Plotly.js 与 React.js,不需懂 javascript 就能作出好看的 UI 元素
1 | pip install dash==0.29.0 |
wordcloud
wordcloud:以词云为对象,依据词语出现的频率绘制词云,可设定词云的大小、颜色、形状等
- 词云图:文字云,对文本数据中出现频率较高的 关键词 在视觉上予以突出,形成关键词的渲染。
1 | pip install wordcloud |
1 | background_color:输出的背景颜色 |
1 | #预处理 |
basemap
mapbox
mapbox:处理地理数据引擎更强的可视化工具库
Geoplotlib
Geoplotlib:地图可视化
pynimate
pynimate:绘制动态可视化图
- 需要 Python3.9+?
- 会使用 Barplot() 来创建条形数据动画,输入数据需要是 pandas 数据结构
1 | import pandas as pd |
