大家好,我是锋哥。最近连载更新《Matplotlib3 Python 数据可视化》技术专题。
本课程讲解利用python进行数据可视化 科研绘图-Matplotlib,学习Matplotlib图形参数基本设置,绘图参数及主要函数,以及Matplotlib基础绘图,和Matplotlib高级绘图。同时也配套视频教程 《2026版 Matplotlib3 Python 数据可视化 视频教程》
以下是 Matplotlib 图形的组成部分。
Matplotlib3 图形 (Figure)
在 Matplotlib 中,图形 (Figure) 是最高级别的容器对象,相当于一个画布或画框,用于容纳所有可视化元素。Figure 对象是整个绘图的基础,管理着所有子图、坐标轴、标签和其他可视化组件。
使用 plt.figure() 显式创建
plt.figure(
num=None, # 图形标识(ID或标题)
figsize=None, # 图形尺寸(宽,高,单位英寸)
dpi=None, # 分辨率(每英寸点数)
facecolor=None, # 图形背景色
edgecolor=None, # 图形边框颜色
frameon=True, # 是否绘制边框
FigureClass=Figure,# 自定义图形类(高级用法)
clear=False, # 是否清除已存在的同名图形
**kwargs # 其他Figure属性
)
我们来看一个示例:
import numpy as np
from matplotlib import pyplot as plt
# 随机生成数据
x = np.arange(2, 20, 1)
y = (x - 1) ** 3 + 1
# 创建Figure对象
fig = plt.figure(
figsize=(10, 6), # 宽度10英寸,高度6英寸
dpi=100, # 分辨率(每英寸点数)
facecolor='#f0f8ff', # 背景颜色(爱丽丝蓝)
edgecolor='#333333', # 边框颜色
linewidth=2, # 边框宽度
frameon=True, # 是否显示边框
layout='constrained' # 布局引擎
)
# 绘图
plt.plot(x, y)
# 显示图片
plt.show()
运行效果:
Matplotlib3 坐标轴 (Axis)
包括x 轴 (XAxis) 和 y 轴 (YAxis),可以定义数据范围并生成刻度(Ticks)和刻度标签。
我们可以使用plt.xlim()和plt.ylim()函数设置坐标刻度值。
import numpy as np
from matplotlib import pyplot as plt
# 生成数据
x = np.arange(0, 20, 1)
y1 = (x - 9) ** 2 + 1
y2 = (x + 5) ** 2 + 8
# 绘图
plt.plot(x, y1)
plt.plot(x, y2)
# 设置x轴的刻度
plt.xlim(0, 20)
# 设置y轴的刻度
plt.ylim(0, 400)
# 显示图片
plt.show()
运行效果:
Matplotlib3 子图 (Axes)
在 Matplotlib 中,Axes(子图) 是最核心的绘图区域,是实际绘制数据的地方。每个 Figure(图形)可以包含多个 Axes 对象,每个 Axes 拥有自己独立的坐标系统、刻度、标签和绘图元素。
Axes 的核心功能
- 数据绘制:支持线图、散点图、柱状图等20+图表类型
- 坐标控制:管理X轴和Y轴的刻度、范围、标签
- 装饰元素:添加标题、图例、网格、文本注释
- 坐标变换:支持线性、对数、极坐标等坐标系统
- 布局管理:在图形中定位和调整大小
我们来看一个示例,通过Axes对象,修改标签,X,Y轴的标签,以及边框颜色,包括边框位置。
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 设置matplotlib使用黑体显示中文
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
# 生成数据
x = np.arange(-20, 20, 1)
y1 = (x - 9) ** 2 + 1
y2 = (x + 5) ** 2 - 108
# 绘图
plt.plot(x, y1)
plt.plot(x, y2)
# 设置x轴的刻度
plt.xlim(-20, 20)
# 设置y轴的刻度
plt.ylim(-400, 400)
# 获取当前的axes
ax = plt.gca()
ax.set_title('测试标题', fontsize=16, pad='20')
ax.set_xlabel('X轴标签', fontsize=10, loc='right')
ax.set_ylabel('Y轴标签', fontsize=10, loc='top')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
# 显示图片
plt.show()
运行效果:
Matplotlib3 线条 (Line)
Matplotlib 中的 Line2D 对象是数据可视化的核心元素之一,用于绘制各种类型的线条图。
主要线条属性详解
1. 线条颜色 (color)
- 支持多种颜色格式:颜色名称、十六进制值、RGB元组
- 常用颜色名称:'red', 'blue', 'green', 'cyan', 'magenta', 'yellow', 'black'
- 示例:
color='crimson'
2. 线条样式 (linestyle)
- 实线:
'-'或'solid' - 虚线:
'--'或'dashed' - 点划线:
'-.'或'dashdot' - 点线:
':'或'dotted' - 示例:
linestyle='--'
3. 线宽 (linewidth)
- 控制线条粗细
- 默认值:1.5
- 示例:
linewidth=2.5
4. 标记 (marker)
- 在数据点处添加标记
- 常用标记:圆形
'o', 方形's', 菱形'D', 上三角'^', 下三角'v' - 其他标记:
'*','p'(五边形),'h'(六边形) - 示例:
marker='o'
5. 标记属性
- 标记大小:
markersize或ms - 标记填充颜色:
markerfacecolor或mfc - 标记边缘颜色:
markeredgecolor或mec - 标记边缘宽度:
markeredgewidth或mew - 示例:
markersize=8, markerfacecolor='yellow', markeredgecolor='black', markeredgewidth=1.5
6. 虚线模式 (dashes)
- 自定义虚线模式:[线长, 间隔长, 线长, 间隔长, ...]
- 示例:
dashes=[10, 3, 3, 3](10点线长, 3点间隔, 3点线长, 3点间隔)
7. 透明度 (alpha)
- 控制线条透明度(0.0完全透明,1.0完全不透明)
- 示例:
alpha=0.6
8. 抗锯齿 (antialiased)
- 使线条更平滑,默认开启
- 示例:
antialiased=True
参考示例:
plt.plot(x, y,
color='darkred', # 线条颜色
linestyle='--', # 线条样式
linewidth=3, # 线宽
marker='o', # 标记形状
markersize=8, # 标记大小
markerfacecolor='gold', # 标记填充色
markeredgecolor='black',# 标记边缘色
markeredgewidth=1.5, # 标记边缘宽度
alpha=0.8, # 透明度
dashes=[15, 5, 5, 5], # 虚线模式
label='完整示例')
完整运行示例:
import numpy as np
from matplotlib import pyplot as plt
# 生成数据
x = np.arange(0, 20, 1)
y1 = (x - 9) ** 2 + 1
y2 = (x + 5) ** 2 + 8
# 绘图 设置线条的颜色,样式,线宽
plt.plot(x, y1, color='red', linestyle='--', linewidth=6.0)
# 设置线条的颜色,标记及标记大小
plt.plot(x, y2, color='yellow', marker='D', markersize=5)
# 显示图片
plt.show()
运行效果:
Matplotlib3 图例 (Legend)
图例是数据可视化中不可或缺的元素,用于标识图表中不同数据系列的含义。
最基础用法,线条参数里,加上label线条文字描述属性,然后直接调用plt.legend()方法显示图例;注意,这里图例的显示的位置默认是best最佳位置,尽可能没有线条干扰。还有显示的是所有线条的图例。
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 设置matplotlib使用黑体显示中文
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
# 生成数据
x = np.arange(0, 20, 1)
y1 = (x - 9) ** 2 + 1
y2 = (x + 5) ** 2 + 8
# 绘图
plt.plot(x, y1, label='利润')
plt.plot(x, y2, label='销量')
# 显示图例
plt.legend()
# 显示图片
plt.show()
我们可以通过loc参数来设置图例的位置:
| 位置字符串 | 数字代码 | 说明 |
|---|---|---|
'best' | 0 | 自动选择 |
'upper right' | 1 | 右上角 |
'upper left' | 2 | 左上角 |
'lower left' | 3 | 左下角 |
'lower right' | 4 | 右下角 |
'center' | 10 | 正中央 |
比如设置 plt.legend(loc='upper right')
则图例显示到右上角:
假如我们有多条线,只想显示部分线的图例,这时候我们需要通过handles属性手动设置图例。
我们看下下方示例:
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 设置matplotlib使用黑体显示中文
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
# 生成数据
x = np.arange(0, 20, 1)
y1 = (x - 9) ** 2 + 1
y2 = (x + 5) ** 2 + 8
# 绘图
line1, = plt.plot(x, y1, label='利润')
line2, = plt.plot(x, y2, label='销量')
# 显示图例 只显示线条1
plt.legend(handles=[line1])
# 显示图片
plt.show()
运行效果:
还有更多细粒度图例设置参数。
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| loc | str/int | 图例位置(默认 'best') | loc='upper left', loc=2 |
| bbox_to_anchor | tuple | 与 loc 配合调整位置 | (1.05, 1)(图例外侧) |
| ncol | int | 图例列数(默认为1列) | ncol=2(分两列显示) |
| title | str | 图例标题 | title='Functions' |
| fontsize | str/float | 字体大小 | fontsize=12, 'small' |
| frameon | bool | 是否显示边框 | frameon=False |
| shadow | bool | 是否显示阴影 | shadow=True |
| facecolor | str | 背景颜色 | facecolor='#f0f0f0' |
| edgecolor | str | 边框颜色 | edgecolor='blue' |
| fancybox | bool | 圆角边框 | fancybox=False(直角) |
Matplotlib3 标注 (Annotations)
标注是数据可视化中用于突出显示特定数据点或区域的重要工具。
annotate() 是 Matplotlib 中用于添加文本注解的核心方法,特别适合在图表中标注特定数据点。以下是全面解析:
plt.annotate(
text, # 注解文本内容
xy, # 被注解点的坐标 (x, y)
xytext=None, # 文本位置的坐标 (x, y)
arrowprops=None, # 箭头属性字典
**kwargs # 文本属性 (颜色/字体/对齐等)
)
核心参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
| text | 注解文本内容 | "Peak Value" |
| xy | 被注解点的坐标 | (3, 9) |
| xytext | 文本位置坐标 | (4, 10) |
| arrowprops | 箭头属性字典 | dict(arrowstyle="->") |
| xycoords | 坐标系统(默认为'data') | 'axes fraction' |
| textcoords | 文本坐标系统 | 'offset points' |
| fontsize | 字体大小 | 12 或 'large' |
| color | 文本颜色 | "red" |
| bbox | 文本背景框 | dict(boxstyle="round", fc="w") |
| rotation | 文本旋转角度 | 45 (度) |
| ha/va | 水平/垂直对齐 | 'center', 'top' |
箭头属性详解 (arrowprops)
通过字典自定义箭头样式:
arrowprops = {
'arrowstyle': '->', # 箭头样式
'connectionstyle': 'arc3', # 连接线样式
'color': 'blue', # 箭头颜色
'linewidth': 2, # 线宽
'linestyle': '--', # 线型
'alpha': 0.7, # 透明度
'relpos': (0.5, 0.5) # 箭头起点相对位置
}
常用箭头样式:
| 样式字符串 | 说明 | 图示 |
|---|---|---|
'-' | 无箭头直线 | —— |
'->' | 单箭头 | → |
'<-' | 反向单箭头 | ← |
'<->' | 双箭头 | ↔ |
'fancy' | 精致箭头 | ➤ |
'wedge' | 楔形箭头 | ▷ |
坐标系统详解
通过 xycoords 和 textcoords 指定坐标基准:
| 坐标系统 | 说明 | 应用场景 |
|---|---|---|
| 'data' | 默认数据坐标 | 标注数据点 |
| 'axes fraction' | 子图比例 (0,0)左下 (1,1)右上 | 固定位置标注 |
| 'figure fraction' | 全图比例 | 跨子图标注 |
| 'offset points' | 相对某点的像素偏移 | 微调位置 |
| 'polar' | 极坐标 (theta, r) | 极坐标图 |
# 使用不同坐标系统的示例
plt.annotate(
'Fixed Position',
xy=(0.5, 0.5),
xycoords='axes fraction', # 子图中点
ha='center'
)
完整实例:
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 设置matplotlib使用黑体显示中文
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
# 生成数据
x = np.arange(-400, 400, 5)
y = (x - 2) * 2 + 100
# 绘图
plt.plot(x, y)
# 设置x轴的刻度
plt.xlim(-400, 400)
# 设置y轴的刻度
plt.ylim(-400, 400)
# 获取当前的axes
ax = plt.gca()
ax.set_title('测试标题', fontsize=16, pad='20')
ax.set_xlabel('X轴标签', fontsize=10, loc='right')
ax.set_ylabel('Y轴标签', fontsize=10, loc='top')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
x1 = 100
y1 = (x1 - 2) * 2 + 100
# 绘制点
plt.scatter(x1, y1, s=45, color='r')
# 绘制虚线
plt.plot([x1, x1], [y1, 0], 'y--', lw=2)
# 加标注
plt.annotate('y = (x - 2) * 2 + 100', xy=(x1, y1), textcoords='offset points', xytext=(+40, -40),
arrowprops=dict(
arrowstyle="->",
connectionstyle="arc3,rad=0.2", # 弧度连接
color="gray"
))
# 显示图片
plt.show()
运行效果:
Matplotlib3 网格 (Grid)
坐标轴网格线是在图表背景中显示的参考线,帮助用户更准确地读取数据点的位置。
ax.grid() 是 Matplotlib 中用于控制图表网格线的核心方法,它提供了丰富的参数来自定义网格线的显示效果。以下是对所有参数的详细解析:
ax.grid(
visible=None, # 是否显示网格
which='major', # 网格类型
axis='both', # 坐标轴方向
**kwargs # 线条样式参数
)
基本参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| visible | 是否显示网格 | None(切换状态) |
| which | 网格类型:'major'(主网格)、'minor'(次网格)、'both' | 'major' |
| axis | 网格方向:'x'、'y'、'both' | 'both' |
| **kwargs | 样式参数:color, linestyle, linewidth, alpha 等 | - |
示例:
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 设置matplotlib使用黑体显示中文
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
# 生成数据
x = np.arange(-400, 400, 5)
y = (x - 2) * 2 + 100
# 绘图
plt.plot(x, y)
# 设置x轴的刻度
plt.xlim(-400, 400)
# 设置y轴的刻度
plt.ylim(-400, 400)
# 获取当前的axes
ax = plt.gca()
ax.set_title('测试标题', fontsize=16, pad='20')
ax.set_xlabel('X轴标签', fontsize=10, loc='right')
ax.set_ylabel('Y轴标签', fontsize=10, loc='top')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
# 基础网格设置 线条样式,透明度 ,颜色
ax.grid(True, linestyle='-', alpha=0.3, color='gray')
x1 = 100
y1 = (x1 - 2) * 2 + 100
# 绘制点
plt.scatter(x1, y1, s=45, color='r')
# 绘制虚线
plt.plot([x1, x1], [y1, 0], 'y--', lw=2)
# 加标注
plt.annotate('y = (x - 2) * 2 + 100', xy=(x1, y1), textcoords='offset points', xytext=(+40, -40),
arrowprops=dict(
arrowstyle="->",
connectionstyle="arc3,rad=0.2", # 弧度连接
color="gray"
))
# 显示图片
plt.show()
运行效果: