1、Matplotlib 的三层结构
Matplotlib 是一个用于在 Python 中创建二维图表的库。为了更好地理解和使用 Matplotlib,重要的是要了解其三层结构:容器层(Container Layer)、辅助显示层(Helper Layer)和图像层(Artist Layer)。这些层级构成了 Matplotlib 的绘图体系结构。
1)容器层(Container Layer)
组件 | 描述 |
FigureCanvas | 最底层的容器, 代表了绘图的整个窗口或页面。 它是一个用于绘制 和渲染所有图表元素的物理或概念性的画布。 |
Figure | 代表了绘图窗口的顶层容器。 一个 Figure 可以包含多个 Axes 对象。 |
Axes | 是一个包含图表大部分元素的容器, 如线条、标记、文字、标签等, 通常与“坐标轴”相关联。 一个 Axes 对象代表了图表的一个绘图区域。 |
2) 辅助显示层(Helper Layer)
辅助显示层是对容器层的补充,提供了一系列方便的方法来创建常见的图表(如直方图、折线图等),并处理诸如刻度定位、布局和颜色映射等常见情况。
组件 | 描述 |
pyplot 模块 | 是 Matplotlib 的辅助显示层, 提供了一组命令式函数来快速生成简单图表。 例如, |
Axis 和 Tick 对象 | Axis 对象处理刻度线、网格线、标签等, 而 Tick 对象是 Axis 的组件, 用于处理刻度线和刻度标签。 |
3)图像层(Artist Layer)
图像层是 Matplotlib 的核心层,包含了用于绘制图表的所有对象(称为艺术家对象,或简称“艺术家”)。
组件 | 描述 |
Artist | 包括 Text(文本),Line2D(线条) ,Rectangle(矩形,用于绘制柱状图)、AxesImage(图像)等。 这些对象知道如何使用渲染器在画布上绘制自己。 |
Renderer | 负责在 FigureCanvas 上绘制 Artist。 用户通常不直接与渲染器交互, 而是通过艺术家对象的方法间接进行。 |
2、使用画布(Figure)
Matplotlib 中,画布是指整个图形界面或图形的总体背景,通常在绘图之前设置。在 Matplotlib 中,画布由 Figure 对象表示。可以通过调整 Figure 对象的属性来自定义画布的大小、分辨率和边框等。plt.figure()
函数用于创建新的图形窗口,并提供了许多用于自定义这些图形窗口的参数。常用参数如下,
参数 | 描述 |
figsize | 图形的大小,以英寸为单位, 传递一个元组(宽度,高度)。 |
dpi | 图形的分辨率, 以每英寸点数(dots per inch)表示。 |
facecolor | 图形的背景颜色。 |
edgecolor | 图形边框的颜色。 |
frameon | 布尔值,用于控制是否绘制图形边框。 |
num | 图形的编号或名称。如果编号已存在, 则使用已存在的图形。 |
tight_layout | 布尔值或字典。如果为 True, 则使用 tight layout 调整子图布局以适应图形区域。 |
使用示例:
import matplotlib.pyplot as plt
# 创建画布(Figure)
fig = plt.figure(figsize=(10, 6), # 图形大小为 10x6 英寸
dpi=80, # 分辨率为 80 dpi
facecolor='white', # 背景色为白色
edgecolor='blue', # 边框颜色为蓝色
frameon=True, # 绘制图形边框
num='MyFigure', # 图形的名称为 'MyFigure'
tight_layout=True) # 使用 tight layout 自动调整布局
# 在画布上添加一个轴(Axes)
ax = fig.add_subplot(111)
# 在轴上绘图
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], marker='o', color='b')
# 设置标题和轴标签
ax.set_title("Simple Plot on Custom Figure")
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
# 将画布设置为活动画布
plt.set_current_fig(fig)
# 使用 plt.draw() 显示画布
plt.draw()
# 显示图形
plt.show()
3、绘制折线图
折线图是最基本的图表类型,通常用于显示随时间变化的数据。plt.plot()
函数是用于创建线图的基本工具。常用参数如下,
参数 | 描述 |
x | 线图中点的 x 坐标。 |
y | 线图中点的 y 坐标。 |
color | 线条的颜色,可为颜色代码或颜色名称。 |
linestyle | 线条的样式,例如 '-', '--', '-.', ':' 等。 |
linewidth | 线条的宽度。 |
marker | 数据点的标记样式,例如 'o', '*', '+' 等。 |
markersize | 标记的大小。 |
label | 用于图例的标签。 |
alpha | 线条的透明度,范围 |
使用示例:
import matplotlib.pyplot as plt
# 示例数据
x = range(1, 6)
y = [1, 4, 6, 8, 4]
# 创建线图
plt.plot(x, y, color='green', linestyle='--', linewidth=2, marker='o', markersize=10, label='Data Line', alpha=0.7)
# 添加图例
plt.legend()
# 添加标题和轴标签
plt.title('Line Plot Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 显示图表
plt.show()
4、 绘制散点图
散点图通常用于显示两个变量之间的关系。plt.scatter()
函数用于创建散点图,是数据可视化中常用的一个工具。常用参数如下,
参数 | 描述 |
x | 散点的 x 坐标。 |
y | 散点的 y 坐标。 |
s | 散点的大小,可以是单个数值或与数据点数量相等的数组。 |
c | 散点的颜色,可以是单个颜色格式的字符串或一系列颜色。 |
marker | 标记的样式,默认为 'o'。 |
alpha | 散点的透明度,介于 0(完全透明)和 1(完全不透明)之间。 |
linewidths | 标记边缘的线宽。 |
edgecolors | 标记边缘的颜色。 |
label | 用于图例的标签。 |
使用示例:
import matplotlib.pyplot as plt
# 示例数据
x = [5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6]
y = [99, 86, 87, 88, 100, 86, 103, 87, 94, 78, 77, 85, 86]
sizes = [210, 410, 312, 214, 415, 312, 213, 210, 410, 312, 214, 415, 312]
colors = ['red', 'green', 'blue', 'yellow', 'pink', 'black', 'orange', 'purple', 'beige', 'brown', 'gray', 'cyan', 'magenta']
# 创建散点图
plt.scatter(x, y, s=sizes, c=colors, marker='o', alpha=0.5, linewidths=2, edgecolors='w', label='Data Points')
# 添加图例
plt.legend()
# 添加标题和轴标签
plt.title('Custom Scatter Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 显示图表
plt.show()
5、 绘制条形图
条形图用于比较不同类别的数据。Matplotlib 库中,plt.bar()
函数是用于创建条形图的常用函数。
常用参数如下,
参数 | 描述 |
x | 条形的 x 坐标。 |
height | 条形的高度。 |
width | 条形的宽度,默认值为 0.8。 |
bottom | 条形的起始位置 y 坐标,默认为 None。 |
align | 条形的对齐方式,'center' 或 'edge', 默认为 'center'。 |
color | 条形的颜色。 |
edgecolor | 条形边缘的颜色。 |
linewidth | 条形边缘的线宽。 |
tick_label | 用作条形标签的标签序列。 |
label | 用于为条形图添加图例的标签。 |
使用示例:
import matplotlib.pyplot as plt
# 示例数据
categories = ['Category A', 'Category B', 'Category C', 'Category D']
values = [10, 15, 7, 12]
# 创建条形图
plt.bar(x=categories, # x 坐标
height=values, # 条形的高度
width=0.6, # 条形的宽度
bottom=0, # 条形的起始位置 y 坐标
align='center', # 条形的对齐方式
color='blue', # 条形的颜色
edgecolor='black', # 条形边缘的颜色
linewidth=1, # 条形边缘的线宽
tick_label=categories, # 条形标签
label='Value') # 图例标签
# 添加 x 轴和 y 轴标签
plt.xlabel('Categories')
plt.ylabel('Values')
# 添加图表标题
plt.title('Bar Chart Example')
# 显示图例
plt.legend()
# 显示图表
plt.show()
6、添加额外元素
可以添加更多元素来改进图表,例如图例、网格线和不同的样式。
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制基础图形
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)')
# 添加标题和标签
plt.title("Simple Plot of sin(x)") # 添加标题
plt.xlabel("x") # x轴标签
plt.ylabel("sin(x)") # y轴标签
# 添加图例
plt.legend()
# 添加网格
plt.grid(True)
# 添加注释
plt.annotate('Local Max', xy=(1.57, 1), xytext=(2, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05))
# 使用 plt.draw() 显示画布
plt.draw()
# 显示图形
plt.show()
7、保存图形
Matplotlib 中,保存图形到文件是一个简单的过程。可以使用 savefig()
方法来保存图形。常用参数如下,
参数 | 描述 |
fname | 输出文件的名称。字符串、类路径对象或类二进制对象。必备参数。 |
format | 输出格式。字符串, 支持的格式为eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff。 默认值为None。 |
dpi | 输出图像的分辨率(每英寸的像素点数)。 浮点数或'figure',如果值为'figure',输出使用图形的分辨率, 默认值为rcParams["savefig.dpi"](默认为'figure')。 |
quality | jpg文件输出的质量,仅对'jpg'或'jpeg'文件生效。整数, 建议取值范围为[1-95],值超过100将会禁用jpeg压缩算法, 可能会导致文件过大。默认值为rcParams["savefig.jpeg_quality"] (默认值为95)。 |
facecolor | 图像的背景色。颜色值或'auto',值为'auto'时, 使用当前图形的背景色。 默认值为rcParams["savefig.facecolor"](即'auto')。 |
edgecolor | 图像边缘颜色。颜色值或'auto', 值为'auto'时,使用当前图形边缘颜色。 默认值为rcParams["savefig.edgecolor"](即'auto')。 |
orientation | postscript后端参数。 取值范围为{'landscape', 'portrait'}。 默认值为'portrait'。 |
papertype | 纸张大小,仅支持postscript输出。 取值范围为{'letter', 'legal', 'executive', 'ledger', 'a0' - 'a10', 'b0' - 'b10'}。 默认值为None。 |
backend | 使用非默认后端渲染文件。字符串。 可选参数。默认值为None。 |
metadata | 用于存储图像元数据的键值对。 字典,取值依赖于输出图像格式和后端。 可选参数。默认值为None。 |
pil_kwargs | 保存图像是传递给PIL.Image.Image.save的参数。 字典。可选参数。 |
使用示例:
import matplotlib.pyplot as plt
# 创建画布
fig = plt.figure()
# 在画布上添加一个轴
ax = fig.add_subplot(111)
# 在轴上绘图
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], marker='o', color='b')
# 设置标题
ax.set_title("Simple Plot")
# 设置轴标签
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
# 添加图例
ax.legend(["Line 1"])
# 添加网格线
ax.grid()
# 添加注释
ax.annotate("www.cjavapy.com", (3, 27))
# 使用 plt.draw() 显示画布
plt.draw()
plt.savefig("line_plot.png") # 保存为 PNG 文件
# 显示图形
plt.show()