【技术专题】Matplotlib3 Python 数据可视化 - Matplotlib3图形组件详解

0 阅读10分钟

大家好,我是锋哥。最近连载更新《Matplotlib3 Python 数据可视化》技术专题。

image.png

本课程讲解利用python进行数据可视化 科研绘图-Matplotlib,学习Matplotlib图形参数基本设置,绘图参数及主要函数,以及Matplotlib基础绘图,和Matplotlib高级绘图。同时也配套视频教程 《2026版 Matplotlib3 Python 数据可视化 视频教程》

以下是 Matplotlib 图形的组成部分。

image.png

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()

运行效果:

image.png

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()

运行效果:

image.png

Matplotlib3 子图 (Axes)

在 Matplotlib 中,Axes(子图) 是最核心的绘图区域,是实际绘制数据的地方。每个 Figure(图形)可以包含多个 Axes 对象,每个 Axes 拥有自己独立的坐标系统、刻度、标签和绘图元素。

Axes 的核心功能

  1. 数据绘制:支持线图、散点图、柱状图等20+图表类型
  2. 坐标控制:管理X轴和Y轴的刻度、范围、标签
  3. 装饰元素:添加标题、图例、网格、文本注释
  4. 坐标变换:支持线性、对数、极坐标等坐标系统
  5. 布局管理:在图形中定位和调整大小

我们来看一个示例,通过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()

运行效果:

image.png

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. 标记属性

  • 标记大小:markersizems
  • 标记填充颜色:markerfacecolormfc
  • 标记边缘颜色:markeredgecolormec
  • 标记边缘宽度:markeredgewidthmew
  • 示例: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()

运行效果:

image.png

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()

image.png

我们可以通过loc参数来设置图例的位置:

位置字符串数字代码说明
'best'0自动选择
'upper right'1右上角
'upper left'2左上角
'lower left'3左下角
'lower right'4右下角
'center'10正中央

比如设置 plt.legend(loc='upper right')

则图例显示到右上角:

image.png

假如我们有多条线,只想显示部分线的图例,这时候我们需要通过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()

运行效果:

image.png

还有更多细粒度图例设置参数。

参数类型说明示例
locstr/int图例位置(默认 'best'loc='upper left', loc=2
bbox_to_anchortupleloc 配合调整位置(1.05, 1)(图例外侧)
ncolint图例列数(默认为1列)ncol=2(分两列显示)
titlestr图例标题title='Functions'
fontsizestr/float字体大小fontsize=12, 'small'
frameonbool是否显示边框frameon=False
shadowbool是否显示阴影shadow=True
facecolorstr背景颜色facecolor='#f0f0f0'
edgecolorstr边框颜色edgecolor='blue'
fancyboxbool圆角边框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'楔形箭头

坐标系统详解

通过 xycoordstextcoords 指定坐标基准:

坐标系统说明应用场景
'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()

运行效果:

image.png

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()

运行效果:

image.png