matplotlib 是 Python 中最著名、最基础的数据可视化库,它功能强大,高度可定制,可以让你轻松地创建出版质量的静态、动态和交互式图表,它被设计为与 NumPy 数值计算库紧密集成,并且是 Pandas 数据分析库中默认的绘图后端。

为什么使用 Matplotlib?
- 功能全面:几乎可以绘制所有你想要的2D图表,包括线图、散点图、柱状图、直方图、饼图、箱线图、误差棒图等,对于3D图表,它也有支持。
- 高度可定制:你可以控制图表的几乎每一个元素,包括坐标轴、标签、标题、图例、线条样式、颜色、字体等。
- 生态系统核心:它是许多其他高级可视化库(如
Seaborn,Pandas的.plot()方法)的基础,理解了matplotlib,学习这些库会事半功倍。 - 跨平台:可以在所有主流操作系统上运行。
- 免费开源:基于 BSD 许可证,可以自由使用和分发。
核心概念:Artist 对象
理解 matplotlib 的关键在于理解它的 Artist 对象模型,你可以把一幅 matplotlib 图表想象成一个画布,上面有许多独立的“艺术家”元素共同构成了一幅完整的画。
主要的 Artist 对象包括:
Figure(画布):整个图表窗口或页面,它是所有元素的顶级容器。Axes(坐标系/子图):这是最重要的一个对象,它是一个带有刻度和标签的特定区域,是绘制数据的地方,一个Figure可以包含一个或多个Axes,我们通常所说的“图表”指的就是一个Axes对象。Axis(坐标轴):控制数据坐标轴的刻度、标签和位置,一个Axes对象包含两个或三个Axis对象(X轴、Y轴,有时还有Z轴)。Artist(其他元素) (Title)、图例 (Legend)、文本注释 (Text)、线条 (Line2D)、矩形 (Rectangle) 等。
核心思想:你通过操作这些 Artist 对象来构建和定制你的图表。
基本使用方法
matplotlib 提供了两种主要的接口:

pyplot接口 (推荐初学者使用):这是一种类似 MATLAB 的接口,提供了一系列命令式的函数来快速绘图。pyplot会自动管理Figure和Axes的创建和销毁,非常方便。- 面向对象 (OO) 接口:当你需要更精细地控制图表(在一个
Figure中创建多个子图)时,这种接口更清晰、更强大。
Pyplot 接口
这是最常用、最简单的方式,使用 import matplotlib.pyplot as plt 来导入。
基本绘图流程:
import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
x = np.linspace(0, 10, 100) # 生成从0到10的100个点
y = np.sin(x)
# 2. 创建图表和坐标系 (plt.plot会自动完成)
plt.plot(x, y, label='sin(x)', color='blue', linestyle='--')
# 3. 添加图表元素"Sine Wave") # 标题
plt.xlabel("X-axis") # X轴标签
plt.ylabel("Y-axis") # Y轴标签
plt.legend() # 显示图例
plt.grid(True) # 显示网格
# 4. 显示或保存图表
plt.show() # 显示图表
# plt.savefig("sine_wave.png") # 保存图表为文件
面向对象 接口
这种方式更明确,代码更具可读性,特别是在处理复杂图表时。
import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 2. 创建 Figure 和 Axes 对象
fig, ax = plt.subplots() # subplots() 是创建一个Figure和一个Axes的快捷方式
# 3. 在 Axes 对象上进行绘图
ax.plot(x, y, label='sin(x)', color='blue', linestyle='--')
# 4. 在 Axes 对象上添加元素
ax.set_title("Sine Wave") # 使用 ax.set_... 来设置属性
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.legend()
ax.grid(True)
# 5. 显示图表
plt.show()
对比:

plt.title()vsax.set_title():pyplot的函数会作用于当前活动的Axes,而OO接口则直接在特定的ax对象上操作。plt.subplots()是创建Figure和Axes的首选方法,它返回一个fig和一个ax(如果只创建一个子图)或一个ax数组(如果创建多个子图)。
常用图表类型示例
折线图
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.5) y1 = np.sin(x) y2 = np.cos(x) plt.plot(x, y1, 'r^-', label='sin(x)') # 'r^-': 红色,三角形标记,实线 plt.plot(x, y2, 'bo--', label='cos(x)') # 'bo--': 蓝色,圆形标记,虚线 plt.legend() plt.show()
散点图
import matplotlib.pyplot as plt import numpy as np # 生成随机数据 np.random.seed(0) x = np.random.rand(50) y = np.random.rand(50) colors = np.random.rand(50) sizes = 1000 * np.random.rand(50) # 点的大小 plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis') plt.colorbar() # 显示颜色条 plt.show()
柱状图
import matplotlib.pyplot as plt
categories = ['A', 'B', 'C', 'D']
values = [15, 30, 45, 10]
plt.bar(categories, values, color=['red', 'blue', 'green', 'orange'])'Bar Chart Example')
plt.xlabel('Category')
plt.ylabel('Value')
plt.show()
直方图
用于展示数据的分布情况。
import matplotlib.pyplot as plt
import numpy as np
# 生成正态分布数据
data = np.random.randn(1000)
plt.hist(data, bins=30, color='purple', alpha=0.7) # bins: 条形的数量'Histogram of a Normal Distribution')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()
饼图
import matplotlib.pyplot as plt
sizes = [15, 30, 45, 10]
labels = ['A', 'B', 'C', 'D']
explode = (0, 0.1, 0, 0) # 突出显示第二块
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
plt.axis('equal') # 保证饼图是圆形的
plt.show()
高级定制技巧
设置中文字体
默认情况下,matplotlib 可能无法正确显示中文,会出现方框,你需要指定一个支持中文的字体。
import matplotlib.pyplot as plt
# 设置中文字体,以 Windows 系统为例
plt.rcParams['font.sans-serif'] = ['SimHei'] # 'SimHei' 是黑体,你也可以用 'Microsoft YaHei' 等
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
"这是一个中文标题")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()
创建多个子图
使用 plt.subplots() 或 fig.add_subplot()。
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 2, figsize=(10, 8)) # 创建一个2x2的子图网格,画布大小为10x8
# 第一个子图 (左上)
axes[0, 0].plot(np.random.rand(10), 'o-')
axes[0, 0].set_title('Subplot 1')
# 第二个子图 (右上)
axes[0, 1].bar(['A', 'B', 'C'], [3, 5, 2])
axes[0, 1].set_title('Subplot 2')
# 第三个子图 (左下)
axes[1, 0].hist(np.random.randn(100), bins=15)
axes[1, 0].set_title('Subplot 3')
# 第四个子图 (右下)
axes[1, 1].scatter(np.random.rand(20), np.random.rand(20))
axes[1, 1].set_title('Subplot 4')
# 自动调整子图间距,防止重叠
plt.tight_layout()
plt.show()
保存图表
使用 plt.savefig() 函数。
plt.plot(x, y)"Save this plot")
# dpi: 分辨率, bbox_inches: 'tight' 会裁掉图表周围的空白
plt.savefig("my_plot.png", dpi=300, bbox_inches='tight')
总结与学习建议
matplotlib 是数据可视化的基石,虽然它的语法有时看起来有些繁琐,但它的灵活性和强大功能使其不可或缺。
学习建议:
- 从
pyplot开始:先用plt.plot(),plt.scatter()等简单命令绘制基本图表,快速获得成就感。 - 转向 OO 接口:当你需要绘制多个子图或对图表进行精细控制时,一定要学习和使用面向对象的方法 (
fig, ax = plt.subplots()),这是从新手到熟练的必经之路。 - 勤查官方文档:
matplotlib的官方文档是最好的教程和参考,几乎所有问题都能在文档中找到答案。 - 模仿和修改:在网上找一些你喜欢的图表代码,尝试理解并修改它,看看每个参数的变化会带来什么效果。
掌握了 matplotlib,你就打开了 Python 数据世界的大门,能够将抽象的数据转化为直观、有洞察力的图形。
