Python 数据可视化:Matplotlib 库入门——从零基础到绘制专业图表
Matplotlib是Python中最经典的2D/3D数据可视化库,由John D. Hunter于2003年开发(灵感来源于MATLAB的绘图功能)。高度可定制:从线条颜色到字体大小,几乎所有图表元素都能手动调整;跨平台支持:Windows、macOS、Linux无缝运行;生态兼容:与NumPy、Pandas深度集成,可直接绘制DataFrame数据;输出多样:支持PNG、JPG、PDF、SVG
引言:为什么数据可视化是“信息的第二语言”?
在数据爆炸的时代,“用图表说话”比“用数字说话”更高效。例如,一组月度销售额数据([120, 150, 180, 200])用表格展示可能平淡无奇,但用折线图呈现“持续增长”的趋势,能瞬间抓住注意力。Python的Matplotlib库正是这样一个“可视化神器”——它支持从基础折线图到复杂3D图的全场景绘制,是数据分析师、科研工作者的必备工具。本文将从0到1带你掌握Matplotlib的核心用法。
一、Matplotlib 基础:从“画布”到“图表”的核心概念
1.1 什么是Matplotlib?
Matplotlib是Python中最经典的2D/3D数据可视化库,由John D. Hunter于2003年开发(灵感来源于MATLAB的绘图功能)。它的核心优势在于:
- 高度可定制:从线条颜色到字体大小,几乎所有图表元素都能手动调整;
- 跨平台支持:Windows、macOS、Linux无缝运行;
- 生态兼容:与NumPy、Pandas深度集成,可直接绘制DataFrame数据;
- 输出多样:支持PNG、JPG、PDF、SVG等多种格式。
1.2 核心组件:Figure与Axes的“双层结构”
Matplotlib的图表采用“双层结构”:
- Figure(画布):最外层容器,相当于“画纸”,可以包含多个子图;
- Axes(子图):Figure中的一个具体图表(如折线图、柱状图),每个Axes有独立的坐标轴(x轴、y轴)、标题、图例等。
关系图示:
Figure(画布)
├─ Axes 1(子图1:折线图)
│ ├─ xaxis(x轴)
│ └─ yaxis(y轴)
└─ Axes 2(子图2:柱状图)
├─ xaxis(x轴)
└─ yaxis(y轴)
1.3 快速安装与导入
安装(终端执行):
pip install matplotlib
导入(Python代码):
import matplotlib.pyplot as plt # 约定俗成的别名
import numpy as np # 配合生成数据
二、基础图表绘制:折线图、柱状图、散点图的“三板斧”
2.1 折线图(Line Plot):展示趋势变化
适用场景:时间序列数据(如销售额月变化、温度日变化)、函数曲线(如sin(x))。
核心函数:plt.plot(x, y, [参数])
示例1:2023年某城市月平均气温
# 准备数据(x轴:月份,y轴:温度)
months = np.arange(1, 13) # [1,2,...,12]
temperatures = [3, 5, 8, 15, 20, 25, 28, 27, 22, 16, 10, 5]
# 绘制折线图
plt.plot(months, temperatures,
color='r', # 线条颜色(红色)
linestyle='--', # 线条样式(虚线)
linewidth=2, # 线条粗细
marker='o') # 数据点标记(圆圈)
# 添加图表标题和坐标轴标签
plt.title("2023年月平均气温变化", fontsize=14)
plt.xlabel("月份", fontsize=12)
plt.ylabel("温度(℃)", fontsize=12)
# 显示图表
plt.show()
效果说明:
- 折线图清晰展示了气温“先升后降”的趋势;
marker='o'在数据点添加圆圈标记,增强可读性。
2.2 柱状图(Bar Chart):比较分类数据
适用场景:不同类别数据的对比(如各部门销售额、各省人口)。
核心函数:plt.bar(x, height, [参数])(垂直柱状图)或plt.barh(y, width)(水平柱状图)
示例2:2023年各部门销售额对比
# 准备数据(部门名称、销售额)
departments = ['技术部', '销售部', '运营部', '财务部']
sales = [80, 150, 120, 60]
# 绘制垂直柱状图
plt.bar(departments, sales,
color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'], # 自定义颜色
edgecolor='black', # 柱子边框颜色
width=0.6) # 柱子宽度
# 添加数据标签(柱顶显示具体数值)
for i, val in enumerate(sales):
plt.text(i, val + 3, f'{val}万', ha='center', fontsize=10)
# 添加标题和标签
plt.title("2023年各部门销售额对比", fontsize=14)
plt.xlabel("部门", fontsize=12)
plt.ylabel("销售额(万元)", fontsize=12)
plt.show()
效果说明:
- 不同颜色区分部门,更易识别;
- 数据标签直接显示具体数值,避免读者猜测。
2.3 散点图(Scatter Plot):探索变量关系
适用场景:分析两个变量的相关性(如身高与体重、广告投入与销量)。
核心函数:plt.scatter(x, y, [参数])
示例3:广告投入与销量的相关性分析
# 生成模拟数据(广告投入x,销量y)
np.random.seed(42) # 固定随机数,保证结果可复现
x = np.random.randint(10, 100, size=50) # 广告投入(10-100万)
y = 0.8 * x + np.random.normal(0, 10, 50) # 销量=0.8*投入+随机误差
# 绘制散点图
plt.scatter(x, y,
color='green', # 点颜色
s=50, # 点大小
alpha=0.7, # 透明度(0-1)
edgecolor='black')# 点边框颜色
# 添加趋势线(用NumPy拟合直线)
m, b = np.polyfit(x, y, 1) # 一次多项式拟合(斜率m,截距b)
plt.plot(x, m*x + b, color='red', linestyle='--', linewidth=2) # 绘制趋势线
# 添加标题和标签
plt.title("广告投入与销量的相关性", fontsize=14)
plt.xlabel("广告投入(万元)", fontsize=12)
plt.ylabel("销量(千件)", fontsize=12)
plt.show()
效果说明:
- 散点图直观展示了“广告投入越高,销量越高”的正相关关系;
- 红色趋势线(拟合直线)进一步量化了这种关系(斜率0.8表示每增加1万广告,销量约增0.8千件)。
三、图表美化:从“能用”到“专业”的5个技巧
3.1 调整图表大小与分辨率
默认图表较小,通过plt.figure(figsize=(宽, 高), dpi=分辨率)调整:
plt.figure(figsize=(10, 6), dpi=100) # 宽10英寸,高6英寸,分辨率100dpi
3.2 添加图例(Legend)
当图表中有多条曲线或多个类别时,图例能明确标识每个元素的含义:
# 绘制两条折线(2022 vs 2023年气温)
plt.plot(months, temperatures_2022, label='2022年')
plt.plot(months, temperatures_2023, label='2023年')
plt.legend(loc='upper left', fontsize=10) # 图例位置(左上)、字体大小
3.3 定制坐标轴刻度
通过plt.xticks()和plt.yticks()调整刻度标签和间隔:
# 设置x轴刻度为1-12月,字体旋转45度(避免重叠)
plt.xticks(months, labels=[f'{m}月' for m in months], rotation=45)
# 设置y轴刻度范围(0-30℃),间隔5℃
plt.yticks(np.arange(0, 31, 5))
3.4 添加网格线(Grid)
网格线帮助读者更准确读取数据值:
plt.grid(axis='y', linestyle='--', color='gray', alpha=0.3) # 仅显示y轴网格
3.5 保存图表到文件
通过plt.savefig()将图表保存为图片(支持PNG、PDF、SVG等):
plt.savefig('temperature_trend.png', dpi=300, bbox_inches='tight') # 高清保存,自动裁剪白边
四、实战案例:用Matplotlib分析电商销售数据
4.1 场景描述
某电商平台提供了2023年Q1各月份的“销售额”和“用户活跃度”数据(虚构),需要:
- 用折线图展示销售额月变化;
- 用散点图分析用户活跃度与销售额的关系;
- 将两张图表绘制在同一画布(子图)中。
4.2 数据与代码实现
# 准备数据
months = ['1月', '2月', '3月']
sales = [200, 250, 300] # 销售额(万元)
activity = [500, 600, 750] # 用户活跃度(千次)
# 创建画布(1行2列子图,总大小12x5英寸)
plt.figure(figsize=(12, 5), dpi=100)
# 子图1:销售额折线图
plt.subplot(1, 2, 1) # 1行2列,第1个位置
plt.plot(months, sales, 'bo-', linewidth=2, markersize=8) # 蓝色圆圈+实线
plt.title("2023年Q1销售额变化", fontsize=13)
plt.xlabel("月份", fontsize=11)
plt.ylabel("销售额(万元)", fontsize=11)
plt.grid(axis='y', linestyle='--', alpha=0.5)
# 子图2:活跃度与销售额散点图
plt.subplot(1, 2, 2) # 1行2列,第2个位置
plt.scatter(activity, sales, color='orange', s=80, edgecolor='black', alpha=0.8)
plt.title("用户活跃度与销售额关系", fontsize=13)
plt.xlabel("用户活跃度(千次)", fontsize=11)
plt.ylabel("销售额(万元)", fontsize=11)
# 调整子图间距
plt.tight_layout()
# 保存图表
plt.savefig('ecommerce_analysis.png', dpi=300)
plt.show()
4.3 结果解读
- 左图折线清晰显示销售额“1月→2月→3月”持续增长;
- 右图散点表明用户活跃度越高,销售额越高(正相关),验证了“用户活跃促进销售”的假设;
- 子图布局让两张图表对比更直观,适合汇报展示。
五、避坑指南:Matplotlib的5大常见错误
-
忘记调用plt.show():在脚本中绘制图表后,必须调用
plt.show()才能显示窗口(Jupyter Notebook自动显示,但脚本需手动调用)。 -
中文字体乱码:Matplotlib默认不支持中文字体,需手动设置(如:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体(黑体) plt.rcParams['axes.unicode_minus'] = False # 解决负号乱码 ```) -
图表元素重叠:坐标轴标签过长、刻度过多时,标签会重叠。可通过
rotation=45旋转标签(如plt.xticks(rotation=45))或调整图表大小(figsize)解决。 -
多次调用plt.plot导致图表叠加:在同一个
plt对象中多次调用plot()会叠加绘制。若需清空画布,需调用plt.clf()(清空当前Figure)或plt.close()(关闭窗口)。 -
数据类型错误:x/y轴数据需为数值类型(如int/float),若传入字符串会报错。需确保数据预处理正确(如用
pd.to_numeric()转换)。
结语:Matplotlib是“可视化的起点”,而非“终点”
通过本文的学习,你已掌握Matplotlib的基础用法——从绘制基础图表到美化定制,再到实战分析。但Matplotlib的能力远不止于此:它支持3D绘图(mpl_toolkits.mplot3d)、热力图(plt.imshow())、箱线图(plt.boxplot())等高级图表,还能与Seaborn(更简洁的API)、Plotly(交互式图表)等库结合使用。
数据可视化的核心是“清晰传递信息”,工具只是手段。下一步,建议你用自己的业务数据练习,在实践中掌握更多技巧——毕竟,“画过100张图”比“看过100篇教程”更有价值!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)