Matplotlib 入门:为初学者准备的完整教程
数据可视化是数据科学中至关重要的一步,它能帮助我们理解数据的分布、趋势和关系。在 Python 生态系统中,Matplotlib 是一个功能强大且广泛使用的绘图库。无论你是学生、研究员还是数据分析师,掌握 Matplotlib 都能极大地提升你的工作效率和数据洞察能力。
本教程旨在为完全没有 Matplotlib 经验的初学者提供一个全面、详细的入门指南。我们将从安装开始,逐步深入,讲解 Matplotlib 的基本概念、如何创建各种常用图表、以及如何对图表进行精细的定制,最终让你能够自信地使用 Matplotlib 进行数据可视化。
预计阅读时间: 约 25-35 分钟
目标读者: 对 Matplotlib 完全陌生的 Python 用户
先决条件: 熟悉 Python 基础语法
目录
-
引言:什么是 Matplotlib?
- 数据可视化的重要性
- Matplotlib 的定位和优势
- Pyplot 简介
-
环境准备:安装 Matplotlib
- 使用 pip 安装
- 验证安装
-
Matplotlib 的核心概念:Figure 和 Axes
- Figure(画布)
- Axes(坐标系/绘图区域)
- 理解 Figure 和 Axes 的关系
-
初识 Matplotlib:第一个简单图表
- 导入 Pyplot
- 绘制直线图
- 显示图表
- 通过列表绘制数据
-
掌握基础图表类型
- 直线图 (Line Plot): 绘制趋势
- 散点图 (Scatter Plot): 展示数据点分布和关系
- 柱状图 (Bar Plot): 比较类别数据
- 直方图 (Histogram): 查看数据分布
-
图表元素的添加与定制
- 添加标题 (Title)
- 添加轴标签 (Labels)
- 添加图例 (Legend)
- 设置轴范围 (Limits)
- 添加网格线 (Grid)
- 添加文本注释 (Annotations)
-
图表外观的精细控制
- 颜色 (Color)
- 线型 (Line Style) 和线宽 (Line Width)
- 标记 (Marker) 和标记大小 (Marker Size)
- 透明度 (Alpha)
- 使用内置样式 (Styles)
-
绘制多个子图 (Subplots)
- 使用
plt.subplot()
- 使用
plt.subplots()
(推荐) - 在子图中绘制不同类型的图表
- 使用
-
保存图表
plt.savefig()
函数- 指定文件格式和分辨率
-
一个综合示例:绘制更复杂的图表
- 结合多种技术绘制一个包含多个元素的图表
-
总结与下一步
- 回顾所学内容
- 进一步学习资源和方向
1. 引言:什么是 Matplotlib?
数据可视化的重要性
在处理数据时,仅仅看到数字往往难以获得直观的认识。数据可视化是将数据转化为图形或图像的过程,它能帮助我们:
- 发现趋势和模式: 一眼看出数据随时间的变化趋势、不同类别之间的差异。
- 识别异常值: 图形中的离群点往往很容易被发现。
- 传达洞察: 清晰的图表能够有效地向他人解释你的分析结果。
- 验证假设: 通过可视化快速检查数据是否符合你的预期。
Matplotlib 的定位和优势
Matplotlib 是 Python 中最经典、最基础的绘图库。它提供了非常强大的控制能力,几乎可以定制图表的每一个细节。它的主要优势包括:
- 功能强大: 能够生成各种静态、动态和交互式图表。
- 高度可定制: 从字体、颜色到线型、标记,几乎所有元素都可以调整。
- 广泛应用: 在科学计算、数据分析、机器学习等领域被广泛使用。
- 丰富的生态系统: 与 NumPy、Pandas 等库紧密集成,也有 Seaborn、Plotly 等更高级的库基于 Matplotlib 构建或兼容。
- 文档齐全: 官方文档详细且示例丰富(虽然有时对初学者来说可能显得庞大)。
Pyplot 简介
在 Matplotlib 中,最常用的模块是 matplotlib.pyplot
。它提供了一个方便的、类似 MATLAB 的绘图接口,通过一系列函数调用来创建和定制图表。对于初学者来说,使用 pyplot
是一个很好的起点。我们通常会将其导入为 plt
:
python
import matplotlib.pyplot as plt
在本教程中,我们将主要使用 pyplot
接口,并适当地引入 Matplotlib 的面向对象接口,以便更好地理解图表的结构。
2. 环境准备:安装 Matplotlib
在开始之前,你需要确保你的 Python 环境已经安装了 Matplotlib。最常用的安装方式是使用 pip。
使用 pip 安装
打开你的终端或命令行,执行以下命令:
bash
pip install matplotlib
如果你使用的是 Anaconda 环境,也可以使用 conda 进行安装:
bash
conda install matplotlib
为了更好地支持中文显示和一些特殊字符,建议同时安装 fonttools
:
bash
pip install fonttools
安装过程可能需要一些时间,取决于你的网络状况。
验证安装
安装完成后,你可以通过简单的 Python 代码来验证 Matplotlib 是否成功安装:
python
import matplotlib
print(matplotlib.__version__)
如果成功打印出 Matplotlib 的版本号,说明安装成功。
3. Matplotlib 的核心概念:Figure 和 Axes
理解 Matplotlib 的 Figure 和 Axes 概念对于掌握如何构建和定制复杂图表至关重要。可以把它们想象成绘画过程中的两个关键元素。
Figure(画布)
Figure
对象是 Matplotlib 中的顶层容器,你可以理解为它是一个窗口或者一张画布,所有的图形元素(如坐标系、标题、图例等)都绘制在这个画布上。一个 Figure 可以包含一个或多个 Axes 对象。
你可以使用 plt.figure()
来创建一个 Figure 对象:
python
fig = plt.figure()
调用 plt.figure()
会创建一个新的空白画布。
Axes(坐标系/绘图区域)
Axes
对象是实际绘制数据的地方,它包含了 x 轴、y 轴、数据点、线条、标签、标题等。一个 Figure 可以包含多个 Axes,每个 Axes 都是一个独立的绘图区域。不要混淆 Axes
和 Axis
(Axis
指的是 x轴或 y轴本身)。
虽然你可以通过 fig.add_subplot()
方法向 Figure 中添加 Axes,但更常用且方便的方式是使用 plt.subplots()
函数。
理解 Figure 和 Axes 的关系
plt.subplots(nrows=1, ncols=1)
是一个非常常用的函数,它可以一步到位地创建一个 Figure 和一个或多个 Axes。
python
fig, ax = plt.subplots() # 创建一个 Figure 和一个 Axes
这个函数返回一个包含 Figure 对象和 Axes 对象(或 Axes 对象数组)的元组。当 nrows
和 ncols
都为 1 时(这是默认值),ax
就是一个单个的 Axes 对象。如果 nrows
或 ncols
大于 1,ax
将是一个 NumPy 数组,你需要通过索引来访问每个 Axes,例如 ax[0, 0]
。
为什么理解 Figure 和 Axes 很重要?
虽然 pyplot
提供了一些全局性的函数(如 plt.plot()
, plt.title()
),它们会自动作用于当前的 Figure 和 Axes。但在创建复杂图表或子图时,直接操作 Figure 和 Axes 对象(即使用面向对象的接口,如 ax.plot()
, ax.set_title()
) 会给你更多的控制权,并且代码会更清晰。对于初学者,先用 pyplot
入门,然后逐渐过渡到面向对象接口是一个不错的策略。我们将在后面的章节中结合使用这两种方式。
4. 初识 Matplotlib:第一个简单图表
让我们来绘制一个最简单的直线图。
导入 Pyplot
python
import matplotlib.pyplot as plt
绘制直线图
pyplot
的 plot()
函数是最基础的绘图函数之一。它可以用来绘制线图或散点图。最简单的用法是给它传递一个列表或 NumPy 数组。Matplotlib 会默认将其作为 y 轴的值,而 x 轴的值则默认为这些数据的索引(从 0 开始)。
“`python
绘制一个简单的y值列表
plt.plot([1, 2, 3, 4])
“`
这里,x轴的值默认为 [0, 1, 2, 3],y轴的值为 [1, 2, 3, 4]。
如果你同时提供两个列表或数组,第一个将作为 x 轴的值,第二个作为 y 轴的值。
python
x = [1, 2, 3, 4]
y = [10, 8, 6, 4]
plt.plot(x, y)
显示图表
绘制命令(如 plt.plot()
)实际上只是在内存中创建或修改图表对象,并不会立即显示出来。你需要调用 plt.show()
函数来显示绘制的图表窗口。
“`python
import matplotlib.pyplot as plt
准备数据
x = [1, 2, 3, 4]
y = [10, 8, 6, 4]
绘制直线图
plt.plot(x, y)
显示图表
plt.show()
“`
运行这段代码,应该会弹出一个窗口显示一个简单的直线图。
通过 NumPy 数组绘制数据
在实际应用中,我们经常使用 NumPy 数组来存储和处理数据。Matplotlib 与 NumPy 集成得非常好。
“`python
import matplotlib.pyplot as plt
import numpy as np
创建 NumPy 数组数据
x = np.linspace(0, 10, 100) # 生成0到10之间100个等间隔的数
y = np.sin(x) # 计算这些数的正弦值
绘制正弦曲线
plt.plot(x, y)
显示图表
plt.show()
“`
这段代码将绘制一条平滑的正弦曲线。
5. 掌握基础图表类型
除了直线图,Matplotlib 还支持多种常用的图表类型。
直线图 (Line Plot)
前面已经介绍了 plt.plot()
的基本用法。它可以用来展示数据随某个连续变量(通常是时间)的变化趋势。
你可以绘制多条线在同一个 Axes 中:
“`python
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label=’Sin(x)’) # 绘制第一条线,并加上标签
plt.plot(x, y2, label=’Cos(x)’) # 绘制第二条线,并加上标签
plt.xlabel(‘X Axis’) # 添加x轴标签
plt.ylabel(‘Y Axis’) # 添加y轴标签
plt.title(‘Sin and Cos Waves’) # 添加图表标题
plt.legend() # 显示图例
plt.show()
“`
散点图 (Scatter Plot)
散点图用于显示数据点之间的关系,通常用于观察两个变量之间的相关性。使用 plt.scatter()
函数。
“`python
import matplotlib.pyplot as plt
import numpy as np
生成一些随机数据
np.random.seed(0) # 固定随机种子以便复现
x = np.random.rand(50) * 10 # 50个0到10之间的随机数
y = np.random.rand(50) * 10 # 50个0到10之间的随机数
colors = np.random.rand(50) # 50个随机颜色值
sizes = np.random.rand(50) * 100 # 50个随机大小值
绘制散点图
plt.scatter(x, y, c=colors, s=sizes, alpha=0.7) # c参数控制颜色, s参数控制大小, alpha控制透明度
plt.xlabel(‘Random X’)
plt.ylabel(‘Random Y’)
plt.title(‘Scatter Plot with Random Data’)
plt.show()
“`
柱状图 (Bar Plot)
柱状图用于比较不同类别的数据。plt.bar()
用于绘制垂直柱状图,plt.barh()
用于绘制水平柱状图。
“`python
import matplotlib.pyplot as plt
import numpy as np
类别数据
categories = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]
对应的值
values = [23, 45, 56, 12, 30]
绘制垂直柱状图
plt.bar(categories, values, color=’skyblue’) # 可以指定颜色
plt.xlabel(‘Category’)
plt.ylabel(‘Value’)
plt.title(‘Bar Plot Example’)
plt.show()
“`
绘制水平柱状图:
“`python
import matplotlib.pyplot as plt
categories = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]
values = [23, 45, 56, 12, 30]
plt.barh(categories, values, color=’lightgreen’) # 使用 barh 绘制水平柱状图
plt.xlabel(‘Value’)
plt.ylabel(‘Category’) # 注意x轴和y轴标签的含义互换
plt.title(‘Horizontal Bar Plot Example’)
plt.show()
“`
直方图 (Histogram)
直方图用于显示数据集的分布。它将数据分成若干个区间(bins),然后统计每个区间内数据点的数量。使用 plt.hist()
函数。
“`python
import matplotlib.pyplot as plt
import numpy as np
生成一组服从正态分布的随机数据
data = np.random.randn(1000) # 1000个随机数,均值为0,方差为1
绘制直方图
bins参数指定直方图的柱子数量或边界
plt.hist(data, bins=30, color=’salmon’, edgecolor=’black’) # edgecolor给柱子加边框
plt.xlabel(‘Value’)
plt.ylabel(‘Frequency’)
plt.title(‘Histogram of Random Data’)
plt.show()
“`
6. 图表元素的添加与定制
一个好的图表不仅要展示数据,还需要清晰地说明数据代表什么。这通常通过添加标题、轴标签、图例等元素来实现。
无论是使用 pyplot
接口 (plt.XXX()
) 还是面向对象接口 (ax.set_XXX()
),这些功能都很容易实现。对于单个图表,两者效果类似,但面向对象接口在处理多个子图时更方便。我们将主要展示面向对象接口的使用。
我们通常从 plt.subplots()
开始获取 Figure 和 Axes 对象:
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots() # 创建一个 Figure 和一个 Axes
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y) # 使用 Axes 对象进行绘图
添加标题
ax.set_title(‘Sin Curve’)
添加轴标签
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
显示图表
plt.show()
“`
添加标题 (Title)
pyplot
接口:plt.title('Your Title')
- 面向对象接口:
ax.set_title('Your Title')
添加轴标签 (Labels)
pyplot
接口:plt.xlabel('X-axis Label')
,plt.ylabel('Y-axis Label')
- 面向对象接口:
ax.set_xlabel('X-axis Label')
,ax.set_ylabel('Y-axis Label')
添加图例 (Legend)
当你在同一个 Axes 中绘制多条线或多个数据系列时,图例可以帮助区分它们。你需要在使用 plot()
或 scatter()
等函数时,通过 label
参数为每个数据系列指定一个名称。然后调用 plt.legend()
或 ax.legend()
来显示图例。
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
ax.plot(x, y1, label=’Sin(x)’) # 添加 label
ax.plot(x, y2, label=’Cos(x)’) # 添加 label
ax.set_title(‘Sin and Cos Waves with Legend’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
ax.legend() # 显示图例
plt.show()
“`
设置轴范围 (Limits)
你可以使用 plt.xlim()
、plt.ylim()
或 ax.set_xlim()
、ax.set_ylim()
来手动设置 x 轴和 y 轴的显示范围。
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y)
ax.set_title(‘Sin Curve with Custom Limits’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
ax.set_xlim(0, 5) # 设置x轴范围从0到5
ax.set_ylim(-1.5, 1.5) # 设置y轴范围从-1.5到1.5
plt.show()
“`
添加网格线 (Grid)
网格线可以帮助读者更容易地读取图表中的数值。
pyplot
接口:plt.grid(True)
- 面向对象接口:
ax.grid(True)
你还可以定制网格线的样式(如颜色、线型)。
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y)
ax.set_title(‘Sin Curve with Grid’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
ax.grid(True, linestyle=’–‘, alpha=0.6) # 添加网格线,设置为虚线,半透明
plt.show()
“`
添加文本注释 (Annotations)
你可以在图表的任意位置添加文本说明,或者用箭头指向图表中的特定点。plt.text()
或 ax.text()
用于添加文本,plt.annotate()
或 ax.annotate()
用于添加带箭头的注释。
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y)
ax.set_title(‘Sin Curve with Annotation’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
添加一个简单的文本注释
ax.text(7, 0.5, ‘Peak Value’, fontsize=10, color=’red’)
添加一个带箭头的注释,指向正弦曲线的第一个峰值
ax.annotate(‘First Peak’, xy=(np.pi/2, 1), xytext=(5, 1.2),
arrowprops=dict(facecolor=’black’, shrink=0.05))
plt.show()
``
xy是要注释的点,
xytext是文本放置的位置,
arrowprops` 用于定制箭头的样式。
7. 图表外观的精细控制
Matplotlib 提供了丰富的选项来控制图表的颜色、线型、标记等外观属性,让你的图表更具表现力和专业性。这些选项通常作为参数传递给绘图函数(如 plot
, scatter
, bar
, hist
)。
颜色 (Color)
可以通过多种方式指定颜色:
- 颜色缩写: ‘b’ (蓝色), ‘g’ (绿色), ‘r’ (红色), ‘c’ (青色), ‘m’ (品红), ‘y’ (黄色), ‘k’ (黑色), ‘w’ (白色)
- 全称: ‘blue’, ‘green’, ‘red’, ‘cyan’, ‘magenta’, ‘yellow’, ‘black’, ‘white’
- 十六进制字符串: ‘#EE6666’
- RGB 元组: (0.1, 0.2, 0.5) 值范围在 0 到 1 之间
- 灰度字符串: 例如 ‘0.8’ (表示 80% 的灰度)
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
ax.plot(x, y1, color=’green’, label=’Sin(x)’) # 使用颜色名称
ax.plot(x, y2, color=’#FF7F0E’, label=’Cos(x)’) # 使用十六进制码
ax.legend()
ax.set_title(‘Custom Colors’)
plt.show()
“`
线型 (Line Style) 和线宽 (Line Width)
用于 plot
函数控制线的样式和粗细:
linestyle
(或简写ls
): ‘-‘ (实线), ‘–‘ (虚线), ‘-.’ (点划线), ‘:’ (点线), ‘None’ (无线条)linewidth
(或简写lw
): 设置线的粗细,通常为浮点数
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.cos(x)
ax.plot(x, y1, linestyle=’-‘, lw=1, label=’Solid’)
ax.plot(x, y2, ls=’–‘, lw=2, label=’Dashed’)
ax.plot(x, y3, ls=’:’, lw=3, label=’Dotted’)
ax.legend()
ax.set_title(‘Custom Line Styles and Widths’)
plt.show()
“`
标记 (Marker) 和标记大小 (Marker Size)
用于在数据点位置添加标记,特别是在散点图或点状线图中:
marker
: 设置标记的样式,如 ‘o’ (圆圈), ‘x’ (叉号), ‘s’ (正方形), ‘^’ (三角形), ‘.’ (点) 等markersize
(或简写ms
): 设置标记的大小markeredgecolor
(或简写mec
): 设置标记的边缘颜色markerfacecolor
(或简写mfc
): 设置标记的填充颜色
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0, 10, 10) # 使用较少的数据点以便看到标记
y = np.sin(x)
ax.plot(x, y, marker=’o’, ms=8, mec=’blue’, mfc=’lightblue’, linestyle=’–‘)
ax.set_title(‘Line Plot with Markers’)
plt.show()
“`
对于 scatter
函数,s
参数用于控制标记大小,c
参数控制颜色。
“`python
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
x = np.random.rand(50) * 10
y = np.random.rand(50) * 10
sizes = np.random.rand(50) * 200 + 50 # 50到250之间的大小
colors = np.random.rand(50) # 随机颜色
fig, ax = plt.subplots()
ax.scatter(x, y, s=sizes, c=colors, alpha=0.8, cmap=’viridis’, edgecolors=’w’) # cmap指定颜色映射,edgecolors指定边缘颜色
ax.set_title(‘Scatter Plot with Variable Size and Color’)
plt.show()
“`
透明度 (Alpha)
alpha
参数用于设置图表元素的透明度,值范围在 0 (完全透明) 到 1 (完全不透明) 之间。这在数据点密集时很有用,可以帮助看出重叠区域。
“`python
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
fig, ax = plt.subplots()
ax.scatter(x, y, alpha=0.3) # 设置透明度为 0.3
ax.set_title(‘Scatter Plot with Alpha’)
plt.show()
“`
使用内置样式 (Styles)
Matplotlib 提供了很多内置的样式,可以快速改变图表的整体外观风格。你可以通过 plt.style.use()
函数来应用这些样式。
要查看所有可用的样式:
python
print(plt.style.available)
常用的样式包括 ‘seaborn-v0_8’, ‘ggplot’, ‘fivethirtyeight’, ‘classic’, ‘dark_background’ 等。
“`python
import matplotlib.pyplot as plt
import numpy as np
应用 ‘ggplot’ 样式
plt.style.use(‘ggplot’)
fig, ax = plt.subplots()
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y)
ax.set_title(‘Sin Curve with ggplot Style’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
plt.show()
“`
请注意,plt.style.use()
会影响它之后创建的所有图表,直到你使用 plt.style.use('default')
或其他样式来覆盖它。
8. 绘制多个子图 (Subplots)
有时我们需要在一个 Figure 中展示多个相关的图表,以便于比较。Matplotlib 提供了创建子图的功能。
使用 plt.subplot()
plt.subplot(nrows, ncols, index)
函数可以在一个 Figure 中创建一个 Axes。nrows
和 ncols
分别指定子图的行数和列数,index
指定当前 Axes 的位置(从左上角开始,按行计数,从 1 开始)。
“`python
import matplotlib.pyplot as plt
import numpy as np
创建一个 Figure
plt.figure(figsize=(10, 5)) # 可以指定 Figure 的大小 (宽, 高) 英寸
创建第一个子图 (1行2列,第一个)
plt.subplot(1, 2, 1)
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
plt.plot(x, y1)
plt.title(‘Sin(x)’)
创建第二个子图 (1行2列,第二个)
plt.subplot(1, 2, 2)
y2 = np.cos(x)
plt.plot(x, y2, color=’orange’)
plt.title(‘Cos(x)’)
自动调整子图之间的间距,避免重叠
plt.tight_layout()
plt.show()
“`
这种方式对于简单的子图布局很直观,但当子图数量多或布局复杂时,管理起来可能不太方便,尤其是在使用面向对象接口时。
使用 plt.subplots()
(推荐)
前面提到过的 plt.subplots(nrows, ncols)
函数是创建子图的更现代和推荐的方式。它直接返回 Figure 和 Axes 对象(或 Axes 对象的 NumPy 数组),你可以直接操作这些 Axes 对象进行绘图。
“`python
import matplotlib.pyplot as plt
import numpy as np
创建一个 2行2列 的子图布局
fig 是 Figure 对象
axs 是一个 2×2 的 NumPy 数组,包含了所有的 Axes 对象
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
在左上角子图绘图 (axs[0, 0])
x = np.linspace(0, 10, 100)
axs[0, 0].plot(x, np.sin(x), color=’blue’)
axs[0, 0].set_title(‘Sin(x)’)
在右上角子图绘图 (axs[0, 1])
axs[0, 1].plot(x, np.cos(x), color=’red’)
axs[0, 1].set_title(‘Cos(x)’)
在左下角子图绘图 (axs[1, 0])
axs[1, 0].scatter(np.random.rand(50), np.random.rand(50))
axs[1, 0].set_title(‘Random Scatter’)
在右下角子图绘图 (axs[1, 1])
data = np.random.randn(100)
axs[1, 1].hist(data, bins=20)
axs[1, 1].set_title(‘Random Histogram’)
添加 Figure 的总标题
fig.suptitle(‘Four Different Plots’, fontsize=16)
自动调整子图间距
plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # rect参数可以为suptitle留出空间
plt.show()
“`
使用 plt.subplots()
返回的 axs
数组来操作每个子图的 Axes 对象,是更清晰、更灵活的方式,尤其是在你需要对每个子图进行独立的定制时。
9. 保存图表
当你完成图表的绘制和定制后,通常需要将其保存到文件中,而不是只在屏幕上显示。使用 plt.savefig()
函数可以轻松实现这一点。
“`python
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(8, 6))
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y)
ax.set_title(‘Sin Curve’)
ax.set_xlabel(‘X-axis’)
ax.set_ylabel(‘Y-axis’)
保存图表到文件
文件名 ‘sin_curve.png’
dpi 参数控制分辨率,越高越清晰
bbox_inches=’tight’ 尝试去除图表周围多余的空白
plt.savefig(‘sin_curve.png’, dpi=300, bbox_inches=’tight’)
如果需要显示图表,仍然需要调用 show()
plt.show()
print(“图表已保存为 sin_curve.png”)
“`
savefig()
函数的常用参数:
fname
: 文件名或文件路径。文件扩展名(如.png
,.jpg
,.pdf
,.svg
)决定了保存的格式。dpi
: Dots per inch,控制图像分辨率。对于打印或高质量显示很重要。format
: 明确指定文件格式(可选,通常根据文件名推断)。bbox_inches
: ‘tight’ 可以尝试移除图表周围的空白区域,避免轴标签或标题被裁切。transparent
: True 可以将图表背景设置为透明(适用于 PNG 和 SVG 等格式)。
你可以保存为多种格式,例如:
plt.savefig('my_plot.png')
(PNG 格式,位图)plt.savefig('my_plot.jpg')
(JPEG 格式,位图)plt.savefig('my_plot.pdf')
(PDF 格式,矢量图,推荐用于出版)plt.savefig('my_plot.svg')
(SVG 格式,矢量图,推荐用于网页或矢量编辑)
矢量图格式(如 PDF, SVG)在放大时不会失真,通常更适合出版和高质量输出。
10. 一个综合示例:绘制更复杂的图表
让我们结合前面学到的知识,创建一个稍微复杂一些的图表,包含多个数据系列、定制外观和图例等。
假设我们有一些关于不同城市每月平均温度的数据。
“`python
import matplotlib.pyplot as plt
import numpy as np
模拟一些数据
months = [‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’, ‘May’, ‘Jun’,
‘Jul’, ‘Aug’, ‘Sep’, ‘Oct’, ‘Nov’, ‘Dec’]
城市A的平均温度 (模拟)
temp_city_a = np.array([5, 6, 10, 15, 20, 25, 28, 27, 22, 16, 10, 6])
城市B的平均温度 (模拟)
temp_city_b = np.array([2, 4, 8, 13, 18, 23, 26, 25, 20, 14, 8, 4])
设置图表样式 (可选)
plt.style.use(‘seaborn-v0_8-darkgrid’) # 使用 seaborn 风格
创建 Figure 和 Axes 对象
fig, ax = plt.subplots(figsize=(10, 6)) # 指定 Figure 大小
绘制城市A的温度曲线,带标记
ax.plot(months, temp_city_a, marker=’o’, linestyle=’-‘, color=’steelblue’, label=’City A’)
绘制城市B的温度曲线,使用不同的样式
ax.plot(months, temp_city_b, marker=’x’, linestyle=’–‘, color=’indianred’, label=’City B’)
添加标题和轴标签
ax.set_title(‘Monthly Average Temperature Comparison’, fontsize=16)
ax.set_xlabel(‘Month’, fontsize=12)
ax.set_ylabel(‘Temperature (°C)’, fontsize=12)
添加图例
ax.legend(loc=’upper left’, fontsize=10) # 指定图例位置和字体大小
设置 y 轴范围
ax.set_ylim(0, 35) # 留出一些空间
添加网格线 (样式已经在 style 中定义,这里如果想自定义可以再次调用)
ax.grid(True, linestyle=’:’, alpha=0.6)
在某个点添加文本注释 (例如,城市A的最高温度)
max_temp_a = temp_city_a.max()
max_month_a_index = temp_city_a.argmax()
ax.text(max_month_a_index, max_temp_a + 1, f'{max_temp_a}°C’,
horizontalalignment=’center’, color=’steelblue’, fontsize=10)
在某个点添加文本注释 (例如,城市B的最高温度)
max_temp_b = temp_city_b.max()
max_month_b_index = temp_city_b.argmax()
ax.text(max_month_b_index, max_temp_b + 1, f'{max_temp_b}°C’,
horizontalalignment=’center’, color=’indianred’, fontsize=10)
自动调整布局
fig.tight_layout()
保存图表
plt.savefig(‘temperature_comparison.png’, dpi=300)
显示图表
plt.show()
“`
这段代码展示了如何:
* 导入必要的库。
* 准备数据(使用列表和 NumPy 数组)。
* 应用 Matplotlib 样式。
* 创建 Figure 和 Axes。
* 在 Axes 上绘制多条线,并使用不同的颜色、线型和标记。
* 添加标题、轴标签和图例。
* 设置轴的范围。
* 添加文本注释来突出重要数值。
* 使用 tight_layout()
调整子图间距。
* 保存图表到文件。
* 显示图表。
这是一个相对完整的例子,涵盖了本教程中的大部分基础知识。
11. 总结与下一步
恭喜你!你已经完成了 Matplotlib 的入门学习。在本教程中,我们学习了:
- 什么是 Matplotlib 及其在数据可视化中的作用。
- 如何安装 Matplotlib。
- Matplotlib 的核心概念 Figure 和 Axes。
- 如何使用
pyplot
和面向对象接口创建简单的图表。 - 绘制直线图、散点图、柱状图和直方图。
- 为图表添加标题、轴标签、图例、网格线和文本注释。
- 精细定制图表的颜色、线型、标记等外观属性。
- 创建和管理多个子图。
- 将图表保存到文件。
- 通过一个综合示例巩固所学知识。
这只是 Matplotlib 功能的冰山一角。Matplotlib 还有很多更高级和专业的特性,例如:
- 绘制更复杂的图表类型(如饼图、箱线图、等高线图等)。
- 处理日期和时间数据。
- 创建 3D 图表。
- 制作动画和交互式图表。
- 更高级的布局控制(如 GridSpec)。
- 自定义字体、刻度、颜色映射等。
进一步学习资源和方向:
- Matplotlib 官方文档: 这是最权威的资料来源,虽然内容庞大,但通过搜索特定函数或示例是学习的好方法。
- Matplotlib 示例库: 官方网站上的示例非常丰富,很多时候找到一个类似的示例代码,在其基础上修改,是学习和解决问题的有效途径。
- Seaborn 库: Seaborn 是基于 Matplotlib 的高级统计数据可视化库,提供了更美观的默认样式和更方便的高级图表类型函数,与 Pandas 集成更好。在掌握 Matplotlib 基础后,学习 Seaborn 会让你事半功倍。
- 其他可视化库: Plotly (交互式图表)、Bokeh (交互式图表)、Altair (声明式可视化) 等也是值得了解的 Python 可视化库。
持续练习是掌握 Matplotlib 的关键。尝试用 Matplotlib 绘制你自己的数据,多参考官方示例和文档,你会越来越熟练地使用这个强大的工具。
希望这篇详细的教程为你打开了 Matplotlib 的大门,祝你在数据可视化的旅程中取得成功!