【Python系列课程】23 Matplotlib(二):坐标轴定制、图例与文字标注

> 上一篇我们学会了折线图、散点图、条形图的画法,但默认样式总有点"素"——坐标轴没标签、没有图例、没有标题、刻度太粗糙。本篇来"精装修":把坐标轴调到理想状态,加上图例和文字标注,让图表一看就懂。

一、设置坐标轴标签:plt.xlabel() / plt.ylabel()

一张没有轴标签的图表就像一张没有标题的地图——不知道横轴纵轴各代表什么。

1.1 基础用法

`python
import matplotlib.pyplot as plt
import numpy as np

先设置中文


plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

x = np.linspace(-3, 3, 50)
y = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.xlabel("这是x轴") # 横轴标签
plt.ylabel("这是y轴", fontsize=14) # 纵轴标签,设置字体大小
plt.show()
`

> [图1:有坐标轴标签的sin曲线——横轴显示"这是x轴",纵轴显示"这是y轴"]

1.2 自定义字体属性

`python
plt.xlabel("横轴标签", fontsize=14, color='red', fontweight='bold')
plt.ylabel("纵轴标签", fontsize=14, color='blue', fontstyle='italic')
`

二、设置坐标轴刻度:plt.xticks() / plt.yticks()

默认刻度可能不满足需求——数值太少、太密集、位置不合适。用 xticks()yticks() 精确控制。

2.1 基础用法

`python
x = np.linspace(-3, 3, 50)
y = np.sin(x)

plt.figure()
plt.plot(x, y)

自定义y轴刻度:指定位置和标签


plt.yticks(
ticks=[-1, -0.8, -0.5, -0.1, 1], # 刻度位置
labels=['a', 'b', 'c', 'd', 'e'] # 对应位置的标签
)
plt.show()
`

> [图2:自定义y轴刻度后的sin曲线——刻度位置不变,但标签变成了a/b/c/d/e]

2.2 四种常见刻度操作

`python

操作1:去掉刻度(但保留轴)


plt.figure()
plt.plot(x, y)
plt.xticks(ticks=[]) # 空列表 → 去掉x轴刻度
plt.title('去掉x轴刻度')
plt.show()

操作2:关闭整个坐标系


plt.figure()
plt.plot(x, y)
plt.axis('off') # 关闭整个坐标轴系统
plt.title('关闭坐标轴')
plt.show()

操作3:自定义刻度位置(不设标签,默认显示数值)


plt.figure()
plt.plot(x, y)
new_xticks = np.linspace(-4, 4, 9) # 从-4到4,9个等间距刻度
plt.xticks(ticks=new_xticks)
plt.yticks(ticks=[-1, -0.8, -0.5, -0.1, 1])
plt.title('自定义刻度位置')
plt.show()

操作4:改变刻度文本样式


plt.figure()
plt.plot(x, y)
plt.xticks(ticks=np.arange(-3, 4, 1),
fontsize=12, color='green', rotation=45) # 旋转45度
plt.title('旋转刻度标签')
plt.show()
`

> [图3:四种刻度操作的效果对比——四张图并排展示]

三、设置坐标边框:spines

坐标轴的边框(spines)就是围住图表的那四条线。你可以隐藏某些边框、改变颜色、甚至移动位置。

3.1 设置边框颜色

`python
x = np.linspace(-3, 3, 50)
y = np.sin(x)

plt.figure()
plt.plot(x, y)

ax = plt.gca() # 获取当前坐标体系
ax.spines['right'].set_color('None') # 隐藏右边框
ax.spines['top'].set_color('None') # 隐藏上边框
ax.spines['left'].set_color('red') # 左边框设为红色
ax.spines['bottom'].set_color('green') # 下边框设为绿色

plt.show()
`

> [图4:修改spines颜色后的图表——左红下绿,右和上隐藏]

3.2 指定边框为坐标轴

`python
plt.figure()
plt.plot(x, y)

ax = plt.gca()
ax.spines['right'].set_color('skyblue')
ax.spines['top'].set_color('blue')
ax.spines['left'].set_color('red')
ax.spines['bottom'].set_color('green')

把上边框作为x轴(刻度移到上面去)


ax.xaxis.set_ticks_position('top')

把右边框作为y轴(刻度移到右边去)


ax.yaxis.set_ticks_position('right')

plt.show()
`

3.3 移动坐标轴到指定位置(常用!)

这是制作"笛卡尔坐标系"效果的关键操作:

`python
plt.figure()
plt.plot(x, y)

ax = plt.gca()
ax.spines['right'].set_color('None') # 隐藏右边框
ax.spines['top'].set_color('None') # 隐藏上边框

把左边框移到x=0的位置(y轴原点)


ax.spines['left'].set_position(('data', 0))

把下边框移到y=-0.1的位置


ax.spines['bottom'].set_position(('data', -0.1))

plt.yticks(ticks=[-1, -0.8, -0.5, -0.1, 1],
labels=['a', 'b', 'c', 'd', 'e'])
plt.show()
`

> [图5:笛卡尔坐标系效果——x轴在y=-0.1处,y轴在x=0处,形成经典的数学坐标系]

3.4 边框操作速查表

| 操作 | 代码 |
|

|

|
| 获取坐标体系 | ax = plt.gca() |
| 隐藏某边框 | ax.spines['right'].set_color('None') |
| 改变边框颜色 | ax.spines['left'].set_color('red') |
| 移动边框到数据位置 | ax.spines['left'].set_position(('data', 0)) |
| 移动边框到比例位置 | ax.spines['left'].set_position(('axes', 0.5)) |
| 指定刻度位置 | ax.xaxis.set_ticks_position('top') |

四、创建图例:plt.legend()

当一张图上有多条线时,图例(legend) 是必备的——否则谁知道哪条线代表什么?

4.1 基础用法:用label参数

`python
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = np.sin(x)

plt.figure()
plt.plot(x, y1, color='blue', label='直线')
plt.plot(x, y2, color='green', label='正弦曲线')
plt.legend() # 显示图例(默认位置:best)
plt.show()
`

4.2 图例的常用参数

`python
plt.legend(
loc='lower right', # 图例位置
fontsize=14, # 字体大小
edgecolor='red', # 边框颜色
facecolor='yellow' # 背景颜色
)
`

4.3 loc 参数所有可选值

| loc值 | 位置 |
|

-|

|
| 'best'(默认) | 自动选择最佳位置 |
| 'upper right' | 右上角 |
| 'upper left' | 左上角 |
| 'lower left' | 左下角 |
| 'lower right' | 右下角 |
| 'right' | 右侧中间 |
| 'center left' | 左侧中间 |
| 'upper center' | 上方中间 |
| 'lower center' | 下方中间 |

4.4 手动指定图例内容

有时你不想用 label 参数,或者只想显示部分线:

`python
plt.figure()
line1, = plt.plot(x, y1, color='blue', label='直线')
line2, = plt.plot(x, y2, color='green', label='曲线')

只显示第一条线的图例,且改名为'线条1'


plt.legend(handles=[line1], labels=['线条1'])
plt.show()
`

> [图6:手动指定图例效果——只显示了"线条1"一个图例项]

4.5 指定labels覆盖label

`python
plt.figure()
plt.plot(x, y1, color='blue')
plt.plot(x, y2, color='green')
plt.legend(labels=['直线', '曲线']) # 不依赖label参数,直接指定
plt.show()
`

五、文字标注:plt.text()

在图表的关键位置添加文字,让读者一眼看懂。

5.1 基础用法

`python
x = np.linspace(-3, 3, 50)
y = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.text(x=1.1, y=0.6, # 文字位置
s='y=sin(x)', # 文字内容
size=16, # 字号
color='red') # 颜色
plt.show()
`

5.2 text() 的常用参数

`python
plt.text(x, y, s,
size=14, # 字号
color='blue', # 颜色
ha='center', # 水平对齐:'left', 'center', 'right'
va='top', # 垂直对齐:'top', 'center', 'bottom'
fontweight='bold', # 加粗
style='italic', # 斜体
bbox=dict( # 文字背景框
facecolor='yellow',
alpha=0.5,
edgecolor='red'
))
`

> [图7:带背景框的text标注——黄色半透明背景,红色边框,文字为蓝色]

5.3 添加标题:plt.title()

`python
plt.title('这是图表的标题', fontsize=16, fontweight='bold', color='navy')
`

六、图中图:plt.axes()

plt.axes() 可以在一个画布中创建多个独立的坐标轴("图中图"效果):

`python
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
y3 = np.sin(x)

plt.figure()

主图:占据画布80%大小


plt.axes([0.1, 0.1, 0.8, 0.8])
plt.title('直线')
plt.plot(x, y1)

小图1:右上角


plt.axes([0.2, 0.6, 0.25, 0.25])
plt.title('抛物线')
plt.plot(x, y2)

小图2:左下角


plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(x, y3)
plt.title('正弦曲线')

plt.show()
`

axes([left, bottom, width, height]) 四个数字的含义:
- left:左下角的x坐标(画布宽度的比例,0~1)
- bottom:左下角的y坐标(画布高度的比例,0~1)
- width:坐标框宽度(画布宽度的比例)
- height:坐标框高度(画布高度的比例)

> [图8:图中图效果——大画布里嵌入了两个小图,分别是右上角的抛物线和左下角的正弦曲线]

七、综合案例:绘制一份专业的数据分析图表

把本篇学的所有技巧串起来,画一张"看起来像那么回事"的图表:

`python
import matplotlib.pyplot as plt
import numpy as np

中文支持


plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

数据准备


x = np.linspace(0, 10, 50)
y1 = np.sin(x) + 0.5 * np.random.randn(50) # 带噪声的正弦
y2 = np.sin(x) # 纯净正弦(趋势线)

创建画布


plt.figure(figsize=(10, 6))

散点图:原始数据点


plt.scatter(x, y1,
s=60, c='skyblue', marker='o',
alpha=0.7, edgecolors='navy',
label='观测数据')

折线图:拟合趋势线


plt.plot(x, y2,
color='red', linewidth=2.5,
linestyle='-', label='拟合趋势线')

坐标轴标签


plt.xlabel('时间 (秒)', fontsize=14, fontweight='bold')
plt.ylabel('信号强度', fontsize=14, fontweight='bold')

标题


plt.title('信号观测数据与趋势拟合', fontsize=16, fontweight='bold')

图例


plt.legend(loc='upper right', fontsize=12,
edgecolor='black', facecolor='whitesmoke')

文字标注


plt.text(x=8, y=0.2, s='R² = 0.87',
size=14, color='red', fontweight='bold')

网格


plt.grid(True, alpha=0.3, linestyle='--')

坐标轴样式


ax = plt.gca()
ax.spines['top'].set_color('None')
ax.spines['right'].set_color('None')

plt.show()
`

> [图9:综合案例最终效果——散点+趋势线+图例+文字标注+网格+美化边框]

八、本文总结

| 知识点 | 核心函数 | 关键参数 |
|

--|

|

|
| 轴标签 | plt.xlabel() / plt.ylabel() | fontsize, color, fontweight |
| 轴刻度 | plt.xticks() / plt.yticks() | ticks, labels, rotation |
| 获取坐标体系 | plt.gca() | — |
| 边框操作 | ax.spines[].set_color() / .set_position() | 用'data'或'axes'定位 |
| 图例 | plt.legend() | loc, fontsize, edgecolor, facecolor |
| 文字标注 | plt.text() | x, y, s, size, color, ha, va |
| 图中图 | plt.axes() | [left, bottom, width, height] |

动手练习

1. 画一条cos曲线,设置:(a)x轴标签为"角度";(b)y轴标签为"cos值";(c)标题为"余弦函数";(d)图例显示"cos(x)"。

2. 在上题的基础上,隐藏上边框和右边框,将下边框移到y=0处,左边框移到x=0处。

3. 画两条曲线 y=x²y=x³,用不同的颜色和线型,在图上用 text() 标注两条曲线,并添加图例。

4. 用 plt.axes() 在一张大图里嵌入两张小图,分别显示sin曲线和cos曲线。
下一篇预告:《24 Matplotlib(三):子图布局、图像保存与综合实战》

posted @ 2026-06-27 08:45  AI视界尼奥  阅读(19)  评论(0)    收藏  举报