第四章 可视化工具概览:Python 绘图库怎么选
做数据可视化,说白了就是给数据“化妆”——让枯燥的数字变成一眼能看懂的图形。我见过太多人一开始就扎进代码里,结果画出来的图自己都看不懂。工具选对了,事半功倍;工具没选对,后期改图改到哭。
Python 的绘图库少说也有十几个,但真正在生产里常用的,其实就四个:Matplotlib、Seaborn、Plotly、Bokeh。它们各有各的脾气,下面我一个一个讲清楚。
4.1 四大核心库的定位
先看一张总览图,帮你快速建立画面感。这是我每次给团队新人讲课时都会贴出来的框架,你就把它当一张“地图”用。
4.2 Matplotlib:基本功必须扎实
Matplotlib 是 Python 可视化界的“老大哥”。我当年入坑时,第一个可视化工就是它。它最大的特点就是“给你一个画板,剩下你说了算”——每个像素你都能控制。
但问题也出在这:代码啰嗦。画一个简单的柱状图,你得调 figure、axes、tick、label 一大堆。不过别怕,只要你掌握下面这个核心模板,后面都是套娃。
import matplotlib.pyplot as plt
import numpy as np
# 基础模板
fig, ax = plt.subplots(figsize=(8, 5))
x = np.arange(5)
y = [3, 5, 2, 7, 4]
ax.bar(x, y, color='steelblue')
ax.set_xlabel('类别')
ax.set_ylabel('值')
ax.set_title('我的第一个柱状图')
plt.show()
fig, ax = plt.subplots(),直接用 plt.plot() 一通乱画,结果后面想改子图布局时全得重来。记住:永远用面向对象方式,别用 pyplot 的全局接口。
4.3 Seaborn:统计图表的美颜相机
Seaborn 是建立在 Matplotlib 之上的高层封装。你想想看,每次画分布图都要自己调颜色、边框、图例,烦不烦?Seaborn 把这些琐事全包了。
它最擅长三件事:
- 分布可视化:
histplot、kdeplot、boxplot,一行代码带置信区间 - 关系可视化:
scatterplot、regplot,自动拟合趋势线 - 分类可视化:
catplot、stripplot,处理多组数据对比
举个例子,画一个带核密度估计的直方分布图:
import seaborn as sns
import pandas as pd
import numpy as np
# 生成样本数据
data = np.random.normal(0, 1, 1000)
df = pd.DataFrame({'值': data})
sns.histplot(data=df, x='值', kde=True, bins=30, color='#3498db')
# 只需一行就完成了分布 + 密度曲线
4.4 Plotly:交互式图表的首选
Plotly 是做 web 交互的。它的图表可以直接嵌入 Flask/Django 页面,支持鼠标悬停、缩放、拖拽。我去年帮业务团队做销售数据看板,选了 Plotly,原因是他们需要给老板演示时能动态钻取数据。
核心思路:Plotly 的接口和 Matplotlib 很像,但返回的是一个 Figure 对象,可以序列化成 JSON,再在前端渲染。
import plotly.express as px
import pandas as pd
df = px.data.iris()
fig = px.scatter(df, x='sepal_width', y='sepal_length',
color='species', size='petal_length',
hover_data=['petal_width'])
fig.show() # 默认在浏览器打开,可交互
嗯,这里要注意:Plotly 的离线版本特别大(~15 MB),部署到生产环境时最好用 plotly-orca 导出静态图,或者用 plotly.py 的 JupyterLab 渲染。另外,不要轻易用 Plotly 画大数据集(>10万点),浏览器会卡死。我踩过这个坑。
4.5 Bokeh:专为流式数据而生
Bokeh 和 Plotly 类似,都做 web 交互。但它有两个差异化优势:
- 后端流式更新:可以实时追加数据点,适合监控系统
- Bokeh Server:能跑在 Tornado/Flask 上,实现仪表盘联动
不过它的学习曲线比 Plotly 陡。我个人习惯是:如果不是要做实时流仪表盘,优先选 Plotly。Bokeh 的语法有点奇怪,尤其是 ColumnDataSource 的概念,好多新手都绕半天。
from bokeh.plotting import figure, show
from bokeh.io import output_notebook
output_notebook()
p = figure(width=400, height=400, title="Bokeh 示例")
p.circle([1,2,3,4,5], [6,7,2,4,5], size=15, color="navy", alpha=0.5)
show(p)
4.6 选型对比表
我把四个库的核心维度列成一张表,你按需查就行。
| 维度 | Matplotlib | Seaborn | Plotly | Bokeh |
|---|---|---|---|---|
| 学习曲线 | 中等 | 低 | 中等 | 偏高 |
| 输出类型 | 静态(PNG/SVG/PDF) | 静态 | 交互式 HTML | 交互式 HTML |
| 大数据性能 | 好(后端渲染) | 好 | 差(浏览器压力大) | 好(WebGL 加速) |
| 定制精度 | 极高(像素级) | 中 | 中高 | 中 |
| 典型场景 | 论文、报告 | 探索性分析 | Web 仪表盘 | 实时监控 |
| 包体积 | ~12 MB | ~20 MB(含 Matplotlib) | ~15 MB | ~8 MB |
4.7 我常用的组合拳
我做了五年数据可视化,总结出一套“铁三角”打法拉去复制:
- 探索阶段 → Seaborn + Jupyter Notebook。快速画分布、相关性矩阵,找规律。
- 定稿出图 → 把 Seaborn 图用 Matplotlib 精调。比如 y 轴范围、图注位置、字体大小。
- 演示交付 → Plotly 导出交互式 HTML,或 Bokeh 做成自刷新的数据看板。
切记,不要在一个项目里同时用四个库。团队协作时统一一个库,避免后期“这个图是哪个库画的”这种低效沟通。
sns.set_theme() 或 plt.style.use(),贯穿全文。
4.8 快速起步的安装命令
别在安装上浪费时间。直接跑下面这条,四个库一步到位:
pip install matplotlib seaborn plotly bokeh pandas numpy
如果你想在 Jupyter Notebook 里直接显示 Plotly 图,再加一行:
pip install plotly nbformat
Bokeh 在 Notebook 里默认是 output_notebook(),不需要额外包。