查看全课大纲(第 73 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

Matplotlib坐标刻度、标签、图例、标题

约 13 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

Matplotlib坐标刻度、标签、图例与标题配置

小象实战讲义 · Python数据分析实战

在上一节我们学习了如何使用Matplotlib绘制基础的折线图、散点图等图形。一个完整的图表除了数据本身,还需要清晰的坐标轴、标题和图例来传达信息。本节将深入讲解如何配置坐标轴的范围与刻度、添加坐标轴标签、设置标题和图例,并解决Matplotlib默认不支持中文显示的问题,让你的图表更加专业、易懂。

💡 核心导读

  • 坐标轴范围与刻度:掌握xlim/ylim控制显示范围,xticks/yticks控制刻度位置与标签。
  • 标签系统:区分坐标轴标签(xlabel/ylabel)与刻度标签(xticklabels/yticklabels)的用法。
  • 标题与图例:使用title添加图表标题,通过label参数配合legend添加数据图例。
  • 中文显示:配置rcParams解决Matplotlib默认字体不支持中文的问题。

坐标轴配置:范围与刻度

设置坐标轴范围

默认情况下,Matplotlib会根据数据自动调整坐标轴范围。但有时我们只想关注数据的特定区间。例如,数据有1000个点,但我们只想显示前500个点。

Matplotlib提供了两种接口来设置坐标轴范围:

  • pyplot接口 (plt):plt.xlim() 和 plt.ylim()
  • 面向对象接口 (ax):ax.set_xlim() 和 ax.set_ylim()

两种方式效果相同,但在一个项目中建议保持风格一致。

import matplotlib
matplotlib.use("Agg")  # 使用无界面后端
import matplotlib.pyplot as plt
import numpy as np

# 生成示例数据:0到99的正弦波
x = np.linspace(0, 10 * np.pi, 200)
y = np.sin(x)

# 方式一:使用pyplot接口(plt)设置范围
fig = plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(x, y)
plt.xlim([0, 5 * np.pi])  # 只显示前一半数据
plt.ylim([-1.2, 1.2])
plt.title('使用plt.xlim/ylim设置范围')
plt.xlabel('x (弧度)')
plt.ylabel('sin(x)')

# 方式二:使用面向对象接口(ax)设置范围(在同一张图的第二个子图上)
ax = fig.add_subplot(1, 2, 2)
ax.plot(x, y)
# 使用ax对象的方法设置范围
ax.set_xlim([0, 3 * np.pi])  # 只显示前30%的数据
ax.set_ylim([-0.5, 0.5])
ax.set_title('使用ax.set_xlim设置范围')
ax.set_xlabel('x (弧度)')
ax.set_ylabel('sin(x)')

plt.tight_layout()
print("坐标轴范围设置示例完成:左图显示0-5π,右图显示0-3π")
坐标轴范围设置示例完成:左图显示0-5π,右图显示0-3π

设置显示的刻度

刻度是坐标轴上的标记线,默认Matplotlib会自动选择合适的位置。我们可以手动控制显示哪些刻度。

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

# 生成新的示例数据:0到10的平方
x = list(range(11))
y = [i**2 for i in x]

plt.figure()
plt.plot(x, y, marker='o')
# 设置x轴只显示0, 2, 4, 6, 8, 10这几个位置的刻度线
plt.xticks([0, 2, 4, 6, 8, 10])
plt.title('控制刻度显示位置')
plt.xlabel('x值')
plt.ylabel('x²值')
print("图表已生成,x轴刻度线位置为[0, 2, 4, 6, 8, 10]")
图表已生成,x轴刻度线位置为[0, 2, 4, 6, 8, 10]

标签系统:坐标轴标签与刻度标签

坐标轴标签

坐标轴标签描述整个坐标轴的含义,使用xlabel()和ylabel()添加。

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

# 继续使用平方数据
x = list(range(11))
y = [i**2 for i in x]

plt.figure()
plt.plot(x, y, marker='s', linestyle='--', color='green')
plt.xlabel('输入值 (x)')  # x轴标签
plt.ylabel('平方值 (x²)')  # y轴标签
plt.title('坐标轴标签示例')
print("图表已生成,已添加坐标轴标签")
图表已生成,已添加坐标轴标签

刻度标签

刻度标签是每个刻度位置上的文本标记。例如,将数字刻度0, 5, 10替换为”开始”、“中点”、“结束”。

重要区别:

  • 使用plt接口:plt.xticks(刻度位置列表, 刻度标签列表)
  • 使用ax接口:先ax.set_xticks(刻度位置列表),再ax.set_xticklabels(刻度标签列表)
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

# 使用plt接口设置刻度标签
fig = plt.figure(figsize=(10, 4))

plt.subplot(1, 2, 1)
x = list(range(11))
y = [i**2 for i in x]
plt.plot(x, y)
# plt.xticks(刻度位置列表, 刻度标签列表)
plt.xticks([0, 3, 6, 9, 10], 
           ['起点', '低增长期', '加速期', '高值区', '终点'])
plt.ylabel('指标值')
plt.title('使用plt.xticks设置刻度标签')

# 使用ax接口设置刻度标签(在同一张图的第二个子图上)
ax = fig.add_subplot(1, 2, 2)
ax.plot(x, y)
# 分两步:先设置刻度位置,再设置标签文本
ax.set_xticks([0, 5, 10])
ax.set_xticklabels(['开始', '中点', '结束'])
ax.set_ylabel('性能指标')
ax.set_title('使用ax.set_xticklabels设置刻度标签')

plt.tight_layout()
print("刻度标签设置示例完成:左图使用plt.xticks,右图使用ax.set_xticklabels")
刻度标签设置示例完成:左图使用plt.xticks,右图使用ax.set_xticklabels

标题与图例

添加标题

图表标题使用title()函数添加,描述图表的整体内容。

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

x = list(range(11))
y = [i**2 for i in x]

plt.figure()
plt.plot(x, y, color='red', linewidth=2)
plt.xlabel('时间步长')
plt.ylabel('累积收益')
plt.title('项目收益增长趋势分析 (2024)')  # 添加标题
print("图表已生成,已添加标题")
图表已生成,已添加标题

添加图例

当图表中有多个数据系列时,需要图例来说明每条线代表什么。添加图例需要两步:

  1. 在绘制每个系列时,通过label参数指定系列名称
  2. 调用legend()函数显示图例
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

# 创建多系列数据示例
x = [0, 1, 2, 3, 4]
y1 = [1, 3, 2, 4, 3]  # 系列1:产品A
y2 = [2, 1, 4, 2, 5]  # 系列2:产品B
y3 = [0, 2, 1, 3, 4]  # 系列3:产品C

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

# 子图1:没有图例,无法区分各条线
plt.subplot(1, 2, 1)
plt.plot(x, y1, marker='o')
plt.plot(x, y2, marker='s')
plt.plot(x, y3, marker='^')
plt.title('无图例:难以区分数据系列')
plt.xlabel('季度')
plt.ylabel('销售额')

# 子图2:有图例,清晰明了
plt.subplot(1, 2, 2)
# 绘制三个系列,每个都指定label
plt.plot(x, y1, marker='o', label='产品A')
plt.plot(x, y2, marker='s', label='产品B')
plt.plot(x, y3, marker='^', label='产品C')
plt.title('有图例:清晰区分数据系列')
plt.xlabel('季度')
plt.ylabel('销售额')
plt.legend(loc='best')  # 自动选择最佳位置

plt.tight_layout()
print("图例示例完成:左图无图例难以区分,右图有图例清晰明了")
图例示例完成:左图无图例难以区分,右图有图例清晰明了

中文显示配置

Matplotlib默认使用英文字体,直接使用中文字符会显示为方框。需要通过rcParams配置中文字体。

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

# 配置中文字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
matplotlib.rcParams['axes.unicode_minus'] = False    # 解决负号显示为方块的问题

# 现在可以使用中文了
x = [1, 2, 3, 4, 5]
y1 = [10, 15, 13, 17, 20]
y2 = [8, 12, 14, 11, 18]

plt.figure()
plt.plot(x, y1, marker='o', label='产品A')
plt.plot(x, y2, marker='s', label='产品B')

plt.xlabel('销售季度')
plt.ylabel('销售额(万元)')
plt.title('2024年产品销售趋势')
plt.legend(loc='best')
plt.xticks([1, 2, 3, 4, 5], ['第一季度', '第二季度', '第三季度', '第四季度', '年度总结'])

print("中文图表已生成,所有中文标签正常显示")
中文图表已生成,所有中文标签正常显示

综合实战示例

现在我们将所有配置技巧应用到一个完整的图表中,分别演示plt和ax两种风格的配置。

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np

# 生成三组随机游走数据作为示例
np.random.seed(42)  # 固定随机种子,保证可重复性
n_points = 200
data1 = np.random.randn(n_points).cumsum()
data2 = np.random.randn(n_points).cumsum()
data3 = np.random.randn(n_points).cumsum()

# 风格一:使用plt接口配置
fig = plt.figure(figsize=(14, 5))

# 子图1:plt风格
plt.subplot(1, 2, 1)
# 设置坐标轴范围
plt.xlim([0, 150])  # 只显示前150个点
plt.ylim([min(min(data1[:150]), min(data2[:150]), min(data3[:150])) - 2,
          max(max(data1[:150]), max(data2[:150]), max(data3[:150])) + 2])

# 设置刻度与刻度标签
plt.xticks([0, 50, 100, 150], ['起始', '中期', '后期', '结束'])
plt.yticks([-20, -10, 0, 10, 20])

# 设置坐标轴标签和标题
plt.xlabel('时间步长')
plt.ylabel('累积随机值')
plt.title('随机游走过程分析 (plt风格)')

# 绘制数据并添加图例
plt.plot(data1, label='序列A', linewidth=1.5)
plt.plot(data2, label='序列B', linewidth=1.5, linestyle='--')
plt.plot(data3, label='序列C', linewidth=1.5, linestyle=':')
plt.legend(loc='upper left')

# 子图2:ax风格(在同一张图的第二个子图上)
ax = fig.add_subplot(1, 2, 2)
# 绘制数据
ax.plot(data1, label='序列A', linewidth=1.5)
ax.plot(data2, label='序列B', linewidth=1.5, linestyle='--')
ax.plot(data3, label='序列C', linewidth=1.5, linestyle=':')

# 使用ax对象方法配置
ax.set_xlim([50, 200])  # 显示后150个点
ax.set_ylim([min(min(data1[50:]), min(data2[50:]), min(data3[50:])) - 2,
             max(max(data1[50:]), max(data2[50:]), max(data3[50:])) + 2])

ax.set_xticks([50, 100, 150, 200])
ax.set_xticklabels(['阶段一', '阶段二', '阶段三', '阶段四'])
ax.set_xlabel('观测点')
ax.set_ylabel('累计值')
ax.set_title('随机游走过程分析 (ax风格)')
ax.legend(loc='lower right')

plt.tight_layout()
print("综合实战示例完成:左图为plt配置风格,右图为ax配置风格")
print(f"数据统计:每组{len(data1)}个点,序列A范围[{data1.min():.1f}, {data1.max():.1f}]")
综合实战示例完成:左图为plt配置风格,右图为ax配置风格
数据统计:每组200个点,序列A范围[-13.5, 4.5]

📝 动手练一练

  1. 概念辨析:坐标轴标签(如”销售额”)和刻度标签(如”第一季度”)有什么区别?在什么场景下会使用刻度标签?
👉 点击查看参考答案

坐标轴标签描述整个坐标轴的含义,回答”这个轴表示什么”的问题。例如,x轴标签”时间”表示横坐标是时间维度。

刻度标签是坐标轴上具体刻度位置的文本标记,回答”这个位置代表什么”的问题。例如,在时间轴上,刻度标签可以是”1月”、“2月”、“3月”等。

使用场景:

  • 当坐标轴是分类数据时(如产品类别、季度名称),使用刻度标签替换数字刻度
  • 当需要更直观的文本描述时(如将数字刻度0, 0.5, 1.0替换为”低”, “中”, “高”)
  • 在时间序列图中,将数字时间戳转换为可读的日期格式
  1. 代码实践:创建一个简单的折线图,表示某公司2024年前6个月的销售额(单位:万元),数据为:[120, 135, 118, 156, 142, 168]。要求:
    • 使用中文标签
    • x轴刻度显示为”1月”到”6月”
    • 添加标题”2024年上半年销售额趋势”
    • 添加图例”产品线A”
👉 点击查看参考答案
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

# 配置中文字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

# 销售额数据(万元)
months = list(range(1, 7))
sales = [120, 135, 118, 156, 142, 168]

plt.figure()
plt.plot(months, sales, marker='o', linewidth=2, label='产品线A')

# 设置x轴刻度标签
plt.xticks(months, ['1月', '2月', '3月', '4月', '5月', '6月'])

# 添加标签和标题
plt.xlabel('月份')
plt.ylabel('销售额(万元)')
plt.title('2024年上半年销售额趋势')
plt.legend(loc='best')

# 添加网格线便于阅读
plt.grid(True, linestyle='--', alpha=0.7)

print("2024年上半年销售额图表已生成")
print(f"最高销售额:{max(sales)}万元({months[sales.index(max(sales))]}月)")
print(f"平均销售额:{sum(sales)/len(sales):.1f}万元")
2024年上半年销售额图表已生成
最高销售额:168万元(6月)
平均销售额:139.8万元

本章小结

本节我们深入学习了Matplotlib图表的精细化配置,让图表从”能看”升级到”好看且易懂”。关键要点包括:

📋 行动清单

  • 练习坐标轴控制:尝试用xlim/ylim只显示数据的特定区间,观察图表焦点的变化
  • 配置完整图表:创建一个包含标题、坐标轴标签、刻度标签和图例的完整图表
  • 解决中文问题:在本地环境配置Matplotlib中文字体,确保中文标签正常显示
  • 比较两种风格:分别用plt和ax接口完成相同的图表配置,体会两种编程风格的差异

记住,好的可视化不仅是展示数据,更是讲述数据背后的故事。清晰的坐标轴、恰当的刻度和完整的图例是让观众理解你故事的关键要素。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:Matplotlib坐标刻度、标签、图例、标题
    PDF · 416KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载