跳到主要内容Python 数据可视化实战:Matplotlib、Seaborn 与 Plotly 绘图指南 | 极客日志PythonAI
Python 数据可视化实战:Matplotlib、Seaborn 与 Plotly 绘图指南
介绍 Python 三大绘图库 Matplotlib、Seaborn 和 Plotly 的使用。涵盖折线图、柱状图、散点图、直方图、箱线图、热力图等常见图表类型。提供完整代码示例及运行效果说明,讲解如何安装库、绘制基础统计图表以及创建交互式可视化图表。最后总结各库适用场景及通用美化技巧,帮助读者快速掌握数据可视化技能。
AiEngineer8.9K 浏览 Python 能成为数据可视化的'顶流',离不开强大的绘图库。本文用 Matplotlib(基础)+ Seaborn(统计)+ Plotly(交互)三大库,覆盖 8 种常见图表类型,附完整代码和运行结果描述,手把手教你画出专业级图表!
前置准备:安装绘图库
本文用到的库需提前安装(命令行执行):
pip install matplotlib seaborn plotly
一、Matplotlib:最经典的基础绘图
Matplotlib 是 Python 最老牌的绘图库,适合画基础图表(折线、柱状、散点等),代码灵活但略繁琐。
1.1 折线图(趋势分析)
场景:展示数据随时间或连续变量的变化趋势(如销售额月变化、温度曲线)。
import matplotlib.pyplot as plt
import numpy as np
months = np.arange(1, 13)
sales = [50, 60, 55, 70, 80, 90, 85, 100, 110, 120, 130, 180]
plt.figure(figsize=(10, 5))
plt.plot(months, sales, color='blue',
marker='o',
linestyle='-',
linewidth=2,
label='月销售额')
plt.title('2023 年各月销售额趋势图', fontsize=14, fontweight=)
plt.xlabel(, fontsize=)
plt.ylabel(, fontsize=)
plt.grid(, linestyle=, alpha=)
plt.legend()
plt.show()
'bold'
'月份'
12
'销售额(万元)'
12
True
'--'
0.5
运行结果描述:
弹出一个宽 10cm、高 5cm 的图表窗口,横轴是 1-12 月,纵轴是 0-200 万元。蓝色实线连接各月销售额,每个数据点用圆形标记(如 1 月在 (1,50),12 月在 (12,180))。图表标题为'2023 年各月销售额趋势图',有浅灰色虚线网格,右上角显示图例'月销售额'。整体趋势为逐月上升,12 月达到峰值 180 万元。
1.2 柱状图(分类对比)
场景:比较不同类别的数据大小(如各城市销售额、不同产品销量)。
import matplotlib.pyplot as plt
cities = ['北京', '上海', '广州', '深圳']
sales = [150, 180, 120, 160]
plt.figure(figsize=(8, 5))
plt.bar(cities, sales, color=['#4CAF50', '#2196F3', '#FF9800', '#E91E63'],
edgecolor='black',
width=0.6)
for i, v in enumerate(sales):
plt.text(i, v + 5, f'{v}万元', ha='center', fontsize=10)
plt.title('2023 年 Q4 各城市销售额对比', fontsize=14)
plt.xlabel('城市', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
plt.show()
运行结果描述:
四个彩色柱子(绿、蓝、橙、粉)分别对应北京、上海、广州、深圳。北京柱子高度 150(顶部标'150 万元'),上海最高 180(顶部标'180 万元'),广州最矮 120。横轴标签为城市名,纵轴范围 0-185 万元。柱子带黑色边框,宽度适中,数据标签清晰。
1.3 散点图(相关分析)
场景:观察两个变量的相关性(如身高与体重、广告投入与销量)。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
height = np.random.normal(170, 5, 100)
weight = 0.7 * height + np.random.normal(0, 3, 100)
plt.figure(figsize=(8, 6))
plt.scatter(height, weight, color='red',
alpha=0.6,
s=30,
edgecolor='black')
m, b = np.polyfit(height, weight, 1)
plt.plot(height, m * height + b, color='blue', linewidth=2, label='拟合直线')
plt.title('身高与体重相关性分析', fontsize=14)
plt.xlabel('身高(cm)', fontsize=12)
plt.ylabel('体重(kg)', fontsize=12)
plt.legend()
plt.show()
运行结果描述:
红色散点大致呈'从左下到右上'的趋势(正相关),大部分点分布在蓝色拟合直线附近(如身高 170cm 时,体重约 120kg)。点的透明度 0.6,重叠部分不会完全遮挡。拟合直线方程约为 weight = 0.7*height + b,说明身高每增加 1cm,体重约增加 0.7kg。
二、Seaborn:统计图表的'懒人神器'
Seaborn 基于 Matplotlib,专为统计分析设计,能一键生成复杂图表(如直方图、箱线图、热力图),代码更简洁。
2.1 直方图(分布分析)
场景:观察数据的分布规律(如成绩分布、年龄分布)。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
scores = np.random.normal(75, 10, 100)
plt.figure(figsize=(8, 5))
sns.histplot(scores, bins=15,
kde=True,
color='#FF5722',
edgecolor='black')
plt.title('班级数学成绩分布直方图', fontsize=14)
plt.xlabel('分数', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.show()
运行结果描述:
直方图由 15 个橙色柱子组成,横轴是分数(50-100 分),纵轴是人数。柱子高度最高处对应分数 75(均值),说明大部分学生成绩集中在 70-80 分。橙色曲线是核密度曲线(平滑的分布趋势),与直方图形状一致,呈现'钟形'正态分布特征。
2.2 箱线图(数据分布细节)
场景:展示数据的中位数、四分位数、异常值(如不同班级成绩的稳定性)。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
np.random.seed(42)
data = {
'班级': ['A'] * 50 + ['B'] * 50 + ['C'] * 50,
'成绩': np.concatenate([
np.random.normal(75, 8, 50),
np.random.normal(80, 5, 50),
np.random.normal(70, 10, 50)
])
}
df = pd.DataFrame(data)
plt.figure(figsize=(10, 6))
sns.boxplot(x='班级', y='成绩', data=df, palette='Set2',
width=0.6,
showfliers=True,
hue='班级',
legend=False)
plt.title('不同班级数学成绩箱线图', fontsize=14)
plt.xlabel('班级', fontsize=12)
plt.ylabel('成绩', fontsize=12)
plt.show()
运行结果描述:
三个颜色不同的箱子(A 班绿、B 班黄、C 班粉)对应三个班级。每个箱子中间的横线是中位数(A 班约 75,B 班约 80,C 班约 70),箱子上下边缘是四分位数(中间 50% 数据的范围)。B 班的箱子最矮(高度小),说明成绩波动小(更稳定);C 班的箱子最高且有更多异常值(上下的小圆圈),说明成绩差异大。
2.3 热力图(关联矩阵)
场景:展示多个变量的相关性(如特征间的相关系数矩阵)。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
np.random.seed(42)
corr_matrix = np.round(np.random.rand(5, 5), 2)
np.fill_diagonal(corr_matrix, 1)
corr_matrix = (corr_matrix + corr_matrix.T) / 2
features = ['特征 1', '特征 2', '特征 3', '特征 4', '特征 5']
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True,
cmap='coolwarm',
xticklabels=features,
yticklabels=features,
linewidths=0.5,
vmin=-1, vmax=1)
plt.title('变量间相关系数热力图', fontsize=14)
plt.show()
运行结果描述:
图表是 5x5 的格子矩阵,每个格子颜色从蓝色(负相关)到红色(正相关)。例如,特征 1 和特征 2 的格子标'0.85'(红色,强正相关),特征 3 和特征 5 标'-0.32'(蓝色,弱负相关)。对角线全为 1(黑色,因为数值 1 在颜色范围中间)。格子边缘有细白线分隔,数值清晰标注。
三、Plotly:交互式图表的'天花板'
前面的图表是静态的,而 Plotly 能生成可交互的图表(鼠标悬停看细节、缩放、拖动),适合做网页可视化或演示。
3.1 交互式折线图(动态查看)
import plotly.express as px
import pandas as pd
data = {'月份': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
'销售额': [50, 60, 55, 70, 80, 90, 85, 100, 110, 120, 130, 180]}
df = pd.DataFrame(data)
fig = px.line(df, x='月份', y='销售额', title='2023 年各月销售额(交互式)',
labels={'销售额': '销售额(万元)'},
template='plotly_white')
fig.update_traces(line=dict(color='blue', width=2, dash='solid'),
marker=dict(size=8, color='red'))
fig.show()
运行结果描述:
浏览器自动打开一个网页,显示折线图。鼠标悬停在数据点上,会弹出提示框显示具体月份和销售额(如悬停 12 月点,显示'月份:12,销售额:180 万元')。可以用鼠标拖动缩放(如只看 1-6 月),双击恢复原图。线条是蓝色实线,数据点是红色圆形,标题和轴标签清晰。
3.2 3D 散点图(多维数据展示)
场景:展示三个变量的关系(如 x、y、z 坐标的空间分布)。
import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
'x': np.random.rand(100),
'y': np.random.rand(100),
'z': np.random.rand(100),
'类别': np.random.choice(['A', 'B', 'C'], 100)
})
fig = px.scatter_3d(df, x='x', y='y', z='z', color='类别',
size_max=10,
opacity=0.7,
title='3D 散点图示例')
fig.update_layout(scene=dict(
xaxis_title='X 轴',
yaxis_title='Y 轴',
zaxis_title='Z 轴'
))
fig.show()
运行结果描述:
浏览器显示一个 3D 坐标系,100 个彩色点(A 类红、B 类蓝、C 类绿)分布在空间中。鼠标拖动可旋转视角,滚轮缩放,悬停点显示坐标和类别(如'x:0.5, y:0.3, z:0.8, 类别:A')。点的透明度 0.7,重叠部分可部分看到下层点。
四、图表美化技巧(通用)
无论用哪个库,好的图表都需要'颜值 + 信息'兼顾。以下是通用美化技巧:
| 需求 | 实现方式(以 Matplotlib 为例) |
|---|
| 字体变大/加粗 | plt.title('标题', fontsize=14, fontweight='bold') |
| 避免 x 轴标签重叠 | plt.xticks(rotation=45)(旋转 45 度) |
| 调整颜色主题 | 使用 Seaborn 的 sns.set_palette('pastel')(柔和色调) |
| 添加图表注释 | plt.annotate('峰值', xy=(12, 180), xytext=(10, 160), arrowprops=dict(arrowstyle='->'))(在 (12,180) 处加箭头注释) |
| 保存图表为图片 | plt.savefig('销售额图.png', dpi=300, bbox_inches='tight')(dpi=300 高清,bbox_inches='tight'去除白边) |
五、总结:如何选择绘图库?
- Matplotlib:适合基础图表(折线、柱状),代码灵活,适合需要精细调整的场景。
- Seaborn:适合统计图表(直方图、箱线图、热力图),代码简洁,自动优化样式。
- Plotly:适合交互式图表(网页展示、动态演示),支持缩放、悬停、3D 等高级功能。
掌握这些图表,你已经能覆盖 90% 的数据可视化需求!动手跑一遍代码,调整参数(如颜色、线条样式),很快就能画出属于自己的专业图表~
相关免费在线工具
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online