- 第 107 篇 -
Date: 2025 - 06 - 15
Author: 郑龙浩(仟墨)
Matplotlib -- 数据可视化分析
文章目录
- [Matplotlib -- 数据可视化分析](#Matplotlib – 数据可视化分析)
- [一 Matplotlib 基础](#一 Matplotlib 基础)
-
- [1 介绍](#1 介绍)
- [2 matplotlib的安装](#2 matplotlib的安装)
- [3 matplotlib 的 pyplot 引用](#3 matplotlib 的 pyplot 引用)
- [4 打印可视化图形](#4 打印可视化图形)
- [二 `plt.plot()` --> 绘制图像:折线图](#二
plt.plot()
--> 绘制图像:折线图) -
- [1 绘制线条](#1 绘制线条)
-
- [1.1 绘制 x 和 y点](#1.1 绘制 x 和 y点)
- [1.2 两个点绘制 --> 1条直线](#1.2 两个点绘制 --> 1条直线)
- 绘制两条线
- [1.3 只绘制两个点 --> 无线条](#1.3 只绘制两个点 --> 无线条)
- [1.4 多个点绘制 --> 折线](#1.4 多个点绘制 --> 折线)
- [1.5 自动匹配x轴的点](#1.5 自动匹配x轴的点)
- [2 点标记(marker)](#2 点标记(marker))
- [3 线型(linestyle)](#3 线型(linestyle))
- [4 颜色(`'color'/'c'、'markeredgecolor'/'mec'、'markerfacecolor'/'mfc'`)](#4 颜色(
'color'/'c'、'markeredgecolor'/'mec'、'markerfacecolor'/'mfc'
)) -
- [4.1 **基本颜色**](#4.1 基本颜色)
- [4.2 优先级 和 区别](#4.2 优先级 和 区别)
- [4.3 填充线条颜色](#4.3 填充线条颜色)
- [4.4 标记内部颜色、标记边框颜色](#4.4 标记内部颜色、标记边框颜色)
- [5 标记大小(Markersize)](#5 标记大小(Markersize))
- [6 线宽/线粗(Linewidth)](#6 线宽/线粗(Linewidth))
- [7 不透明度(Alpha)](#7 不透明度(Alpha))
-
- [7.1 `alpha`参数](#7.1
alpha
参数) - [7.2 单独控制标记透明与线条透明](#7.2 单独控制标记透明与线条透明)
- [7.1 `alpha`参数](#7.1
- [8 标签](#8 标签)
-
- [8.1 如果无法显示中文](#8.1 如果无法显示中文)
- [8.2 标签的作用](#8.2 标签的作用)
- [8.3 绘图标题、x轴标签、y轴标签](#8.3 绘图标题、x轴标签、y轴标签)
- [8.4 设置标题、标签的字体属性](#8.4 设置标题、标签的字体属性)
-
- [8.4.1 直接传参](#8.4.1 直接传参)
- [8.4.2 使用字典](#8.4.2 使用字典)
- [8.5 设置标题位置](#8.5 设置标题位置)
- [8.6 所有参数](#8.6 所有参数)
- [9 网格](#9 网格)
-
- [9.1 添加网格](#9.1 添加网格)
- [9.3 设置网格属性](#9.3 设置网格属性)
- [三 `plt.subplot()` --> 创建多个子图](#三
plt.subplot()
--> 创建多个子图) -
- [1 介绍](#1 介绍)
- [2 函数语法 + 使用方法](#2 函数语法 + 使用方法)
- [3 实操](#3 实操)
- [四 `plt.scatter()` --> 绘制散点图](#四
plt.scatter()
--> 绘制散点图) -
- [1 函数语法](#1 函数语法)
- [2 创建散点图](#2 创建散点图)
- [3 点标记、点大小、透明度](#3 点标记、点大小、透明度)
- [4 设置点的颜色(新知识:颜色映射)](#4 设置点的颜色(新知识:颜色映射))
-
- [4.1 默认颜色 --> 当不指定时,默认颜色](#4.1 默认颜色 --> 当不指定时,默认颜色)
- **手动指定颜色:**
- [4.2 颜色名称/缩写](#4.2 颜色名称/缩写)
- [4.3 十六进制颜色码](#4.3 十六进制颜色码)
- [4.4 RGB/RGBA元组](#4.4 RGB/RGBA元组)
- [4.5 灰度值](#4.5 灰度值)
- [4.6 颜色映射(数值 --> 颜色)](#4.6 颜色映射(数值 --> 颜色))
-
- [4.6.1 基础用法](#4.6.1 基础用法)
- [4.6.2 控制数值范围](#4.6.2 控制数值范围)
- 4.6.3常用色表
- [4.6.4 自动归一化机制](#4.6.4 自动归一化机制)
- [4.7 为每个点单独指定颜色](#4.7 为每个点单独指定颜色)
- [5 示例](#5 示例)
- [五 `plt.bar() / plt.barh()` --> 绘制柱状图](#五
plt.bar() / plt.barh()
--> 绘制柱状图) -
- [1 函数语法](#1 函数语法)
-
- [1.1 `plt.bar()`](#1.1
plt.bar()
) - [1.2 `plt.barh()`](#1.2
plt.barh()
) - [1.3 区别](#1.3 区别)
- [1.1 `plt.bar()`](#1.1
- [2 设置颜色](#2 设置颜色)
-
- [2.1 基础颜色](#2.1 基础颜色)
- [2.2 颜色映射(数值→颜色)](#2.2 颜色映射(数值→颜色))
- [3 堆叠柱状图](#3 堆叠柱状图)
- [4 分组柱状图](#4 分组柱状图)
- [5 分组 + 颜色映射 示例](#5 分组 + 颜色映射 示例)
- [六 `plt.hist` --> 绘制直方图](#六
plt.hist
--> 绘制直方图) -
- [1 函数语法](#1 函数语法)
- [2 代码示例](#2 代码示例)
- [七 `plt.pie` --> 绘制饼图](#七
plt.pie
--> 绘制饼图) -
- [1 函数语法](#1 函数语法)
- [2 参数说明](#2 参数说明)
- [3 代码示例](#3 代码示例)
-
- [3.1 基础创建](#3.1 基础创建)
-
- [2. **突出显示B+阴影**](#2. 突出显示B+阴影)
- [3. **环形饼图(甜甜圈图)**](#3. 环形饼图(甜甜圈图))
一 Matplotlib 基础
1 介绍
Matplotlib是Python最常用的绘图库,用于创建静态、交互式和动态可视化
2 matplotlib的安装
-
在终端输入
pip install matplotlib
安装库 -
如果出现
Successfully installed contourpy-1.3.2......
之类的字样表示安装成功如果出现
Requirement already satisfied
之类的字样则表示已经安装过了
3 matplotlib 的 pyplot 引用
大部分使用的程序都是
pyplot
子模块下的,所以通常直接引用pyplot
python
import matplotlib.pyplot as plt
4 打印可视化图形
打印图形的时候,用 print 函数是打印不出来的,必须使用plt.show
使用方法如下:
python
import matplotlib.pyplot as plt
plt.show()
二 plt.plot()
--> 绘制图像:折线图
1 绘制线条
1.1 绘制 x 和 y点
- 用于在图标中绘制点(标记)
- 默认情况下 ,
plot()
函数是点到点绘制一条线
参数1是一个包含x轴上的点的数组
参数2是一个包含y轴上的点的数组
1.2 两个点绘制 --> 1条直线
python
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
xPoints = np.array([1,20]) # x 轴
yPoints = np.array([12,100]) # y 轴
plt.plot(xPoints, yPoints) # 根据xy轴得出一条直线
plt.show()
打印结构如下
绘制两条线
当然也可以绘制两条线,只使用一个plt.show()
打印,如下:
python
import matplotlib.pyplot as plt
import numpy as np
xPoints = np.array([1,20]) # x 轴
yPoints = np.array([12,100]) # y 轴
yPoints2 = np.array([50,100]) # y 轴
plt.plot(xPoints, yPoints) # 根据xy轴得出一条直线
plt.plot(xPoints, yPoints2) # 根据xy轴得出一条直线
plt.show()
打印结果如下
1.3 只绘制两个点 --> 无线条
只绘制起点 和终点两个点
python
plt.plot(xPoints, yPoints2, 'o')
plt.show()
效果
1.4 多个点绘制 --> 折线
其中,两个人参数中的数组元素数量必须保持一致
如果第一个数组3个元素,第二个数组5个元素,不匹配的话会报错
python
xPoints = np.array([1, 5, 7, 50, 100]) # x 轴
yPoints = np.array([2, 4, 25, 6, 60]) # y 轴
plt.plot(xPoints, yPoints)
plt.show()
效果
1.5 自动匹配x轴的点
当然,第一个参数可以不写,只写第二个参数,如果这样的话,x轴的点就是自动生成的了 --> 默认 从0开始,步长为1
比如y轴有5个元素,x轴就是 0 1 2 3 4
python
plt.plot(yPoints)
plt.show()
效果如下

plot()
中常用的参数有:点标记(marker)、线型(linestyle)、线条颜色(color)、标记大小(markersize)、线宽(linewidth)
2 点标记(marker)
标记符号 | 描述 | 示例 |
---|---|---|
'.' |
小圆点 | marker='.' |
',' |
像素点(极小方块) | marker=',' |
'o' |
大圆点 | marker='o' |
'v' |
下三角形(▼) | marker='v' |
'^' |
上三角形(▲) | marker='^' |
'<' |
左三角形(◀) | marker='<' |
'>' |
右三角形(▶) | marker='>' |
'1' |
下箭头(三线版) | marker='1' |
'2' |
上箭头(三线版) | marker='2' |
'3' |
左箭头(三线版) | marker='3' |
'4' |
右箭头(三线版) | marker='4' |
's' |
正方形(■) | marker='s' |
'p' |
五边形(⬟) | marker='p' |
'*' |
星号(★) | marker='*' |
'h' |
六边形(垂直,⬢) | marker='h' |
'H' |
六边形(水平,⬣) | marker='H' |
'+' |
加号(+) | marker='+' |
'x' |
叉号(✖) | marker='x' |
'D' |
菱形(◆) | marker='D' |
'd' |
瘦菱形(❖) | marker='d' |
`' | '` | 垂直线(│) |
'_' |
水平线(─) | marker='_' |
'P' |
填充加号(🞣) | marker='P' |
'X' |
填充叉号(🞨) | marker='X' |
'$...$' |
LaTeX 符号(如 '$\u2665$' 显示❤️) |
marker='$\u2665$' |
查看所有标记
python
import matplotlib.pyplot as plt
# Matplotlib支持的所有标记
markers = ['.', ',', 'o', 'v', '^', '<', '>', '1', '2', '3', '4',
's', 'p', '*', 'h', 'H', '+', 'x', 'D', 'd', '|', '_', 'P', 'X',
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
plt.figure(figsize=(10, 3))
for i, marker in enumerate(markers):
plt.plot(i, 0, marker=marker, markersize=10, label=f"{marker}")
plt.show()
效果
3 线型(linestyle)
线型符号 | 描述 | 示例 |
---|---|---|
'-' |
实线(默认) | linestyle='-' |
'--' |
虚线 | linestyle='--' |
'-.' |
点划线 | linestyle='-.' |
':' |
点线 | linestyle=':' |
'None' |
无线(仅显示点) | linestyle='None' |
简写 --> 线型可以和颜色写到一起:
python
plt.plot(x, y, 'r--') # 红色虚线
plt.plot(x, y, 'g:') # 绿色点线
4 颜色('color'/'c'、'markeredgecolor'/'mec'、'markerfacecolor'/'mfc'
)
可以填充两个部分:①线条颜色 ②标记内部颜色 ③标记边框颜色
4.1 基本颜色
类型 | 参数名 | 作用对象 | 示例 |
---|---|---|---|
统一颜色 | color /c |
同时设置线条、标记内部和边框 | color='red' |
标记内部颜色 | markerfacecolor /mfc |
仅标记填充色 | markerfacecolor='#FF5733' |
标记边框颜色 | markeredgecolor /mec |
仅标记边框色 | markeredgecolor=(0,0.5,0) |
颜色符号 | 描述 | 示例 |
---|---|---|
'b' |
蓝色(blue) | color='b' |
'g' |
绿色(green) | color='g' |
'r' |
红色(red) | color='r' |
'c' |
青色(cyan) | color='c' |
'm' |
品红(magenta) | color='m' |
'y' |
黄色(yellow) | color='y' |
'k' |
黑色(black) | color='k' |
'w' |
白色(white) | color='w' |
其他颜色格式
当然不只是只有这几个颜色,也可以用如下方式去表示其他的颜色
格式 | 示例 |
---|---|
RGB 元组(0-1) | color=(0.2, 0.5, 0.8) |
十六进制颜色 | color='#FF5733' |
颜色名称(字符串) | color='orange' |
4.2 优先级 和 区别
属性 | 参数名(缩写) | 作用对象 | 默认 | 优先级 |
---|---|---|---|---|
线条颜色 | color ( c ) |
连接数据点的线 | 继承自全局样式或默认色 | 最低 |
标记内部颜色 | markerfacecolor (mfc ) |
数据点标记的填充色 | 默认与线条颜色相同 | 中等 |
标记边框颜色 | markeredgecolor (mec ) |
数据点标记的边框色 | 默认与线条颜色相同 | 最高 |
4.3 填充线条颜色
代码示例
python
# sin函数图像
x = np.linspace(0, 10, 20)
y = np.sin(x)
# xy轴,实线,大圆点
# plt.plot(x, y, color='b', linestyle='-', marker='o')
# 十六进制颜色
plt.plot(x, y, color='#FF5733') # 橙色
# RGB元组
plt.plot(x+1, y+1, color=(0.2, 0.6, 0.8)) # 天蓝色
# 颜色名称(全称/简称)
plt.plot(x+2, y+2, color='darkorange') # 深橙色
plt.plot(x+3, y+3, color='y') # 黄色
plt.show()
效果
4.4 标记内部颜色、标记边框颜色
如下所示,
- 如果不指定标记内部颜色、标记边框颜色,则全都默认为"线条颜色"
- 如果不指定标记内部颜色,则标记内部颜色默认为"线条颜色"
- 如果不指定标记边框颜色,则标记边框颜色默认为"线条颜色"
代码示例
python
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 20)
y = np.sin(x)
plt.plot(x+1, y+1, marker='o', color='r', linestyle='-')
plt.plot(x, y, marker='o', color='r', mfc='y') # color='r'--> 线条颜色红色, mec='y'--> 标记颜色"黄色"
plt.plot(x, y, marker='o', color='r', mfc='y', mec='black') # 新增边框颜色为"黑色"
plt.show()
效果
5 标记大小(Markersize)
参数 | 描述 | 示例 |
---|---|---|
markersize |
标记大小(默认 6) | markersize=10 |
示例代码
python
x = np.linspace(0, 10, 20)
y = np.sin(x)
plt.plot(x, y, marker='d', color='b', markersize='10')
plt.show()
效果

6 线宽/线粗(Linewidth)
这里的线宽,指的就是线的粗度
参数 | 描述 | 示例 |
---|---|---|
linewidth |
线宽(默认 1.5) | linewidth=2 |
示例代码
python
plt.plot(x, y, marker='d', color='b', markersize='10', linewidth='0.1')
plt.plot(x+1, y+1, marker='d', color='b', markersize='10', linewidth='5')
plt.show()
效果

7 不透明度(Alpha)
7.1 alpha
参数
alpha
这个参数取值范围是 0(完全透明)到 1(完全不透明)
添加不透明度
python
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 20)
y = np.sin(x)
plt.plot(x+2, y+2, marker='o', color='r', alpha=0.7) # 70% 不透明
plt.plot(x+1, y+1, marker='o', color='r', mfc='y', alpha=0.5) # 50% 不透明
plt.plot(x, y, marker='o', color='r', mfc='y', mec='black', alpha=0.3) # 30% 不透明
plt.show()

7.2 单独控制标记透明与线条透明
-
仅标记透明 :通过调整颜色RGBA值实现
pythonplt.plot(x, y, marker='o', color='r', mfc=(1, 1, 0, 0.5)) # 黄色标记50%透明
-
仅线条透明 :
pythonplt.plot(x, y, marker='o', color=(1, 0, 0, 0.3), mfc='y') # 红色线条30%透明
代码
python
plt.plot(x, y, marker='o', color='r', mfc=(1, 1, 0, 0.5)) # 黄色标记50%透明
plt.plot(x+1, y+1, marker='o', color=(1, 0, 0, 0.3), mfc='y') # 红色线条30%透明
plt.show()
效果
8 标签
是用于说明图表坐标轴含义和图表主题的文本描述,使数据可视化更清晰易懂
8.1 如果无法显示中文
无法正常显示中文:
Matplotlib 最初是为科学计算设计的,早期主要面向英文用户,默认使用英文字体(如 DejaVu Sans)。这些字体不包含中文字符集,遇到中文时会自动回退到空白或方框(□)
标签中写中文 的时候,可能无法正常显示,比如中文显示为方框(□)或乱码想要解决的话,可以手动设置字体
python
plt.rcParams['font.sans-serif'] = ['SimHei'] # 默认字体--黑体
8.2 标签的作用
- x轴:表示什么数据(如时间、距离、类别)
- y轴:表示什么数据(如温度、销量、频率)
- 标题:图表的核心主题
8.3 绘图标题、x轴标签、y轴标签
可以为绘图设置标签,也可以给x和y轴设置标签
代码示例
python
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 默认字体--黑体
days = np.array(['2025.6.13', '6.14', '6.15', '6.16', '6.17', '6.18', '6.19']) # 日期
temperature1 = np.array([22, 22, 22, 22, 21, 23, 21]) # 温度数据 - 最低温
temperature2 = np.array([29, 31, 28, 29, 28, 36, 28]) # 温度数据 - 最高温
plt.plot(days, temperature1, color='b', marker='o', linestyle='--') # 最低温
plt.plot(days, temperature2, color='r', marker='o', linestyle='--') # 最高温
plt.title('温度变化情况')
plt.ylabel('温度(℃)')
plt.xlabel('日期')
plt.show()
实现效果
8.4 设置标题、标签的字体属性
8.4.1 直接传参
实现代码
python
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 默认字体--黑体
days = np.array(['2025.6.13', '6.14', '6.15', '6.16', '6.17', '6.18', '6.19']) # 日期
temperature1 = np.array([22, 22, 22, 22, 21, 23, 21]) # 温度数据 - 最低温
temperature2 = np.array([29, 31, 28, 29, 28, 36, 28]) # 温度数据 - 最高温
plt.plot(days, temperature1, color='b', marker='o', linestyle='--') # 最低温
plt.plot(days, temperature2, color='r', marker='o', linestyle='--') # 最高温
# 1. 设置标题属性
plt.title(
'温度变化情况', # 标签名
fontfamily='SimHei', # 字体(Windows系统黑体)
fontsize=16, # 字体大小 单位-->磅
fontweight='bold', # 加粗 ('normal'/'bold')
color='b', # 蓝色
pad=20 # 标题与图的间距
)
# 2. 设置Y轴标签属性
plt.ylabel(
'温度(℃)', # 标签名
fontfamily='Microsoft YaHei', # 微软雅黑
fontsize=15, # 字体大小
fontstyle='italic', # 斜体
color='r', # 红色
labelpad=15, # 标签与坐标轴的间距
rotation=45, # 标签旋转角度 (单位-->度)
)
# 3. 设置X轴标签属性
plt.xlabel(
'日期',
fontfamily='SimHei', # 黑体
fontsize=15, # 字体大小
rotation=-5, # 标签旋转角度 (单位-->度)
color='g', # 绿色
fontweight='bold', # 加粗
labelpad=10 # 标签与坐标轴的间距
)
plt.show()
实现效果
8.4.2 使用字典
当然也可以用字典,个人感觉这样写看起来比较整洁简单
实现代码
python
plt.rcParams['font.sans-serif'] = ['SimHei'] # 默认字体--黑体
days = np.array(['2025.6.13', '6.14', '6.15', '6.16', '6.17', '6.18', '6.19']) # 日期
temperature1 = np.array([22, 22, 22, 22, 21, 23, 21]) # 温度数据 - 最低温
temperature2 = np.array([29, 31, 28, 29, 28, 36, 28]) # 温度数据 - 最高温
plt.plot(days, temperature1, color='b', marker='o', linestyle='--') # 最低温
plt.plot(days, temperature2, color='r', marker='o', linestyle='--') # 最高温
# 1. 标题属性字典(移除了pad)
title_font = {
'fontfamily': 'SimHei',
'fontsize': 16,
'fontweight': 'bold',
'color': 'b'
}
# 2. Y轴标签属性字典
ylabel_font = {
'fontfamily': 'Microsoft YaHei',
'fontsize': 15,
'fontstyle': 'italic',
'color': 'r',
'rotation': 45
}
# 3. X轴标签属性字典
xlabel_font = {
'fontfamily': 'SimHei',
'fontsize': 15,
'rotation': -5,
'color': 'g',
'fontweight': 'bold'
}
# 应用字典设置,pad作为单独参数
plt.title('温度变化情况', fontdict=title_font, pad=20)
plt.ylabel('温度(℃)', fontdict=ylabel_font, labelpad=15)
plt.xlabel('日期', fontdict=xlabel_font, labelpad=10)
plt.show()
实现效果
8.5 设置标题位置
loc参数可以指定三种:legt/right/center
-- 靠左,靠右,居中
(默认居中)
实现代码
python
plt.title('温度变化情况', loc='left') # legt/right/center
plt.ylabel('温度(℃)')
plt.xlabel('日期')
plt.show()
实现效果
8.6 所有参数
参数名 | 可选值/类型 | 说明 | 适用函数 |
---|---|---|---|
fontfamily |
字符串或字体名 | 指定字体家族,如 'SimHei' , 'Arial' , 'serif' |
所有文本函数 |
fontsize |
数值或相对大小 | 字体大小(磅),如 12 ,或相对值 'xx-small' , 'x-large' |
所有文本函数 |
fontweight |
字符串或数值 | 字体粗细:'normal' , 'bold' , 'light' , 或数值 100-900 |
所有文本函数 |
fontstyle |
'normal' , 'italic' , 'oblique' |
字体样式(常规/斜体/倾斜) | 所有文本函数 |
color |
颜色字符串/RGB元组/十六进制 | 文本颜色,如 'red' , (0.1,0.2,0.3) , '#FF0000' |
所有文本函数 |
rotation |
数值(度)或字符串 | 文本旋转角度(如 45 ),或 'vertical' , 'horizontal' |
xlabel() /ylabel() /text() |
labelpad |
数值 | 标签与坐标轴的间距(磅),仅适用于坐标轴标签 | xlabel() /ylabel() |
backgroundcolor |
颜色值 | 文本背景色 | 所有文本函数 |
alpha |
0-1之间的浮点数 | 文本透明度 | 所有文本函数 |
verticalalignment |
'top' , 'center' , 'bottom' , 'baseline' |
文本垂直对齐方式 | text() /标题类函数 |
horizontalalignment |
'left' , 'center' , 'right' |
文本水平对齐方式 | 所有文本函数 |
bbox |
字典 | 文本边框样式,如 {'boxstyle':'round', 'facecolor':'yellow'} |
所有文本函数 |
usetex |
True /False |
是否使用LaTeX渲染(需系统安装LaTeX) | 所有文本函数 |
9 网格
9.1 添加网格
visible=True
可省略此参数
三种
① 全部
axis='both'
可以省略
python
import numpy as np
import matplotlib.pyplot as plt
y = np.array([1, 10])
plt.plot(y)
plt.grid(axis='both'o) # 显示全部
plt.show() # 全部显示

② 仅纵向
python
import numpy as np
import matplotlib.pyplot as plt
y = np.array([1, 10])
plt.plot(y)
plt.grid(axis = 'x') # 只显示纵向网格
plt.show() # 全部显示

③ 仅横向
python
import numpy as np
import matplotlib.pyplot as plt
y = np.array([1, 10])
plt.plot(y)
plt.grid(axis = 'y') # 只显示横向网格
plt.show() # 全部显示

9.3 设置网格属性
函数语法
python
plt.grid(
visible=True, # 是否显示网格(True/False) --> 默认为 True
which='major', # 网格类型:'major'主网格,默认 / 'minor'次网格)/ 'both'
axis='both', # 显示方向:'x'(仅x轴)/ 'y'(仅y轴)/ 'both'(默认,双轴)
color='gray', # 网格线颜色
linestyle=':', # 线型:'-'(实线),'--'(虚线),':'(点线),'-.'(点划线)
linewidth=0.5, # 线宽(单位:磅)
alpha=0.4 # 透明度(0.0透明 ~ 1.0不透明)
)
线型、颜色、线宽、透明度和前面那些函数的用法相同
python
plt.grid(
visible=True, # 是否显示网格(True/False)
which='major', # 网格类型:'major'(主网格)/ 'minor'(次网格)/ 'both'
axis='both',
color='b',
linestyle='--',
linewidth=1,
alpha=0.7
)
plt.show() # 全部显示

三 plt.subplot()
--> 创建多个子图
1 介绍
subplot()
是Matplotlib
库中用于在单个画布上创建和管理多个子图的核心函数。能够将多个图表以网格形式排列在一个图形窗口中,非常适合数据对比分析或多角度展示数据。
如果需要很多个线条在同一图中显示,有时会显得凌乱,所以可以创建多个图,进行整理和分析
2 函数语法 + 使用方法
说白了,三个参数意思就是: 总共有几行,几列,当前图的位置(横着数,数到头就换行)
python
plt.subplot(
nrows, # 子图网格的行数
ncols, # 子图网格的列数
index # 当前子图的位置(从1开始编号)
)
- nrows:子图网格的行数
- ncols:子图网格的列数
- index:当前子图的位置(从1开始,按行优先编号)
还可以给子图加标题
也可以给总图加标题 -- > 使用超级标题
python
plt.suptitle('超级标题')
3 实操
python
import numpy as np
import matplotlib.pyplot as plt
# plt.grid() # 显示全部
# plt.grid(axis = 'x') # 只显示纵向网格
# 第一个图
x = np.array([1, 5])
y = np.array([1, 10])
plt.title('总图', fontfamily='SimHei')
plt.subplot(2, 2, 1)
plt.plot(x, y)
plt.title('第1个图', fontfamily='SimHei')
# 第二个图
x2 = np.array([1, 5])
y2 = np.array([1, -10])
plt.subplot(2, 2, 2)
plt.plot(x2, y2)
plt.title('第2个图', fontfamily='SimHei')
# 第三个图
x3 = np.array([1, 2, 3, 4]) # 修改为有序x值
y3 = np.array([2, 4, 6, 8])
plt.subplot(2, 2, 3)
plt.plot(x3, y3)
plt.title('第3个图', fontfamily='SimHei')
plt.suptitle('超级标题', fontfamily='SimHei')
plt.show() # 全部显示

四 plt.scatter()
--> 绘制散点图
1 函数语法
函数语法
python
plt.scatter(
x, y, # 数据点坐标(必需)
s=36, # 点大小(默认36,即6x6像素)
c='#1f77b4', # 默蓝色
marker='o', # 默认圆圈
alpha=1.0, # 默认不透明
linewidths=1.5, # 默认边框宽度1.5
edgecolors='face' # 默认边框颜色同填充色
)
2 创建散点图
代码示例
python
import numpy as np
import matplotlib.pyplot as plt
x = [3.85,8.89,1.9,6.04,5.37,2.65,0.31,7.62,9.69,4.46,0.92,3.27,7.12,4.15,8.45,5.59,9.27,6.52,1.47,7.35]
y = [0.71,-3.12,4.12,-2.12,-4.52,3.8,2.38,-1.35,-4.11,-3.98,3.12,0.12,-2.35,-4.12,-3.89,-4.62,-4.21,-3.01,4.35,-2.45]
plt.scatter(x, y)
plt.show()
实现效果
3 点标记、点大小、透明度
散点图也可以设置点的大小与透明度,而且点的大小可以指定一串数值,也就是每个点的大小可以不是固定的
4 设置点的颜色(新知识:颜色映射)
注意:
- 如果同时指定
c
和color
,c
参数优先级更高- 使用
cmap
时必须提供数值型c
参数
4.1 默认颜色 --> 当不指定时,默认颜色
在使用plt.scatter()
绘制散点图的时候,会默认为蓝色(#1f77b4
),当使用了多个plt.scatter()
绘制散点图的时候,且不指定颜色,会按照如下顺序分配颜色:
1. #1f77b4 (蓝色)
2. #ff7f0e (橙色)
3. #2ca02c (绿色)
4. #d62728 (红色)
5. #9467bd (紫色)
6. #8c564b (棕色)
7. #e377c2 (粉色)
8. #7f7f7f (灰色)
- 第1-8个 scatter() 调用:依次使用上述颜色
- 从第9个调用开始:重新从第1个颜色(蓝色)开始循环
手动指定颜色:
4.2 颜色名称/缩写
- 基础色:
'r'
,'g'
,'b'
,'c'
,'m'
,'y'
,'k'
,'w'
- 所有合法颜色名
代码示例
python
plt.subplot(1, 3, 1)
plt.scatter(x, y, c='red') # 英文名称
plt.subplot(1, 3, 2)
plt.scatter(x+1, y+1, c='r') # 缩写 --> 相当于 red
plt.subplot(1, 3, 3)
plt.scatter(x+2, y+2, c='skyblue') # CSS4/CSS颜色名称
plt.show()
显示效果
4.3 十六进制颜色码
python
plt.scatter(x, y, c='#1f77b4') # 默认蓝色

4.4 RGB/RGBA元组
注意
当指定一个RGB或RGBA颜色时,用参数
color
而不是参数c
刚开始我用的
c
,给我弹警告了,我才知道当指定单个颜色(1, 0, 0, 0.5) 的时候,系统无法立即确定意图是:
- 想为所有点设置同一颜色(RGBA),还是
- 想用四个数值做颜色映射(如果数据点恰好也是4个)
如果想要指定多个RGB颜色,需要写成这样
c=[(r1,g1,b1,a1), (r2,g2,b2,a2), ...]
python
plt.scatter(x-2, y-2, color=(1, 0, 0)) # 纯红 (RGB 0-1)
plt.scatter(x, y, color=(0.2, 0.4, 0.6)) # 自定义RGB
plt.scatter(x+2, y+2, color=(1, 0, 0, 0.5)) # 半透明红 (RGBA)

4.5 灰度值
也可以设置灰度值,不止是纯颜色
python
plt.scatter(x, y, c='0.5') # 50%灰(字符串格式,字符串也是小数的形式)
plt.show()

4.6 颜色映射(数值 --> 颜色)
顾名思义,就是数值映射为颜色
4.6.1 基础用法
python
values = np.random.rand(20) # 生成范围数量为20,数字在0-1之间的随机数
plt.scatter(x, y, c=values, cmap='viridis') # 生成随机颜色的散点图
plt.colorbar() # 显示颜色条
plt.show()
颜色条的范围也并非是0~1,这个取决于数值范围,比如数值改成1-100之间的数值:
python
values2 = np.random.randint(1, 101, size=20)
plt.scatter(x, y, c=values2, cmap='viridis') # 生成随机颜色的散点图
plt.colorbar() # 显示颜色条
plt.show()

4.6.2 控制数值范围
python
data = np.random.randint(0, 200, 100) # 数值0-200
plt.scatter(x, y, c=data, cmap='viridis', # 色图映射
vmin=0, # 最小值映射到色表起点
vmax=200) # 最大值映射到色表终点
4.6.3常用色表
类型 | 色表名 | 特点 |
---|---|---|
连续型 | 'viridis' |
蓝-青-黄渐变(推荐)--> 最常用 |
'plasma' |
紫-红-黄(高对比度) | |
发散型 | 'coolwarm' |
蓝-白-红(正负值对比) |
离散型 | 'tab10' |
10种区分色(分类数据) |
4.6.4 自动归一化机制
- 颜色映射的数值并没有一个明确的限制,系统会自动处理任意范围的数值,数据会被自动归一化到 [0,1] 范围,再映射到色表 ,比如指定数据是
1-100
,1
自动归一为0
,而100
自动归一到1
- 无论数据范围是 0-1、1-100 还是 -500~500,Matplotlib 都会通过以下公式自动归一化:
python
归一化值 = (当前值 - vmin) / (vmax - vmin)
- 默认行为:不指定 vmin/vmax 时,系统默认用指定数据的 最小值 和 最大值 作为范围,如下举例:
最小值为50,最大值为200,所以就算不指定,也是默认为vmin=50, vmax=200
python
data = np.array([x for x in range(50, 201, 2)]) # 范围50-200
plt.scatter(x, y, c=data, cmap='viridis')
# 等价于:
# plt.scatter(x, y, c=data, cmap='viridis', vmin=50, vmax=200)
4.7 为每个点单独指定颜色
python
# 每个点不同颜色(数组长度需与数据一致)
colors = ['red', 'blue', 'green'] # 颜色列表
plt.scatter([1,2,3], [1,2,3], c=colors)
# 或用RGB数组
rgb_colors = np.random.rand(100, 3) # 生成100个随机RGB颜色
plt.scatter(x, y, c=rgb_colors)
5 示例
python
import numpy as np
import matplotlib.pyplot as plt
plt.subplot(1, 2, 1)
x = np.array([3.85,8.89,1.9,6.04,5.37,2.65,0.31,7.62,9.69,4.46,0.92,3.27,7.12,4.15,8.45,5.59,9.27,6.52,1.47,7.35])
y = np.array([0.71,-3.12,4.12,-2.12,-4.52,3.8,2.38,-1.35,-4.11,-3.98,3.12,0.12,-2.35,-4.12,-3.89,-4.62,-4.21,-3.01,4.35,-2.45])
sizes = np.random.randint(1, 202, size=20) # 设置点的大小
colors = np.random.rand(20) # 设置颜色
alphas = np.random.rand(20) # 设置不透明度
# plt.scatter(x, y, s=sizes, c=colors, marker='d', alpha=alphas)
plt.colorbar() # 显示颜色条
plt.title('图1', fontfamily='SimHei')
# 图2
plt.subplot(1, 2, 2)
x2 = np.random.randint(1, 200, size=90) # 设置点的大小
y2 = np.random.randint(1, 200, size=90) # 设置点的大小
sizes2 = np.random.randint(1, 202, size=90) # 设置点的大小
colors2 = np.random.rand(90) # 设置颜色
alphas2 = np.random.rand(90) # 设置不透明度
plt.scatter(x2, y2, s=sizes2, c=colors2, marker='o', alpha=alphas2)
plt.title('图2', fontfamily='SimHei')
plt.colorbar() # 显示颜色条
plt.show()

五 plt.bar() / plt.barh()
--> 绘制柱状图
1 函数语法
1.1 plt.bar()
python
plt.bar(
x, height, # 数据位置和高度(必需)
width=0.8, # 柱宽度(默认0.8)
bottom=None, # 柱底部的y坐标(默认从0开始)
color=None, # 柱颜色(默认使用样式循环色)
edgecolor='none', # 边框颜色(默认无边框)
linewidth=1.0, # 边框宽度(默认1.0)
alpha=1.0, # 透明度(默认不透明)
align='center' # 对齐方式(默认居中对齐) 还有 left 和 right
)
1.2 plt.barh()
python
plt.barh(
y, width, # 数据位置和宽度(必需)
height=0.8, # 条形高度(默认0.8)
left=None, # 条形左侧的x坐标(默认从0开始)
color=None, # 条形颜色(默认使用样式循环色)
edgecolor='none', # 边框颜色(默认无边框)
linewidth=1.0, # 边框宽度(默认1.0)
alpha=1.0, # 透明度(默认不透明)
align='center' # 对齐方式(默认居中对齐) 还有 left 和 right
)
1.3 区别
- 方向
- bar():垂直(x=位置,height=高度)
- barh():水平(y=位置,width=宽度)
- 柱高调节
- bar() 用 width 调柱宽
- barh() 用 height 调柱高
2 设置颜色
与 plt.scatter() 类似,但部分参数用法不同
2.1 基础颜色
-
单柱统一颜色
pythonplt.bar(x, height, color='skyblue') # 预定义颜色名 plt.bar(x, height, color='#1f77b4') # 十六进制 plt.bar(x, height, color=(0.2, 0.4, 0.8)) # RGB元组(0~1)
-
多柱不同颜色
pythoncolors = ['red', 'green', 'blue'] plt.bar(x, height, color=colors) # 颜色列表长度需与数据一致
2.2 颜色映射(数值→颜色)
适用场景:根据数值大小自动分配颜色(如热力图效果)
python
values = np.random.rand(10) # 生成0~1的随机值
plt.bar(x, height, color=plt.cm.viridis(values)) # 使用viridis色映射
plt.colorbar() # 显示颜色条
3 堆叠柱状图
通过 bottom
(垂直)或 left
(水平)参数实现:
也就是说,在画第二个图的时候,从上一个图的顶部为起始
python
# 垂直堆叠
plt.bar(x, height1, color='r', label='A')
plt.bar(x, height2, bottom=height1, color='b', label='B') # 在A上堆叠B
# 水平堆叠
plt.barh(y, width1, color='r', label='A')
plt.barh(y, width2, left=width1, color='b', label='B') # 在A右侧堆叠B
4 分组柱状图
调整 x
坐标和 width
实现分组:
python
x = np.arange(3) # 0, 1, 2
width = 0.3 # 柱宽
plt.bar(x - width/2, height1, width, label='Group1')
plt.bar(x + width/2, height2, width, label='Group2')
plt.xticks(x, ['A', 'B', 'C']) # 设置x轴标签
5 分组 + 颜色映射 示例
python
import numpy as np
import matplotlib.pyplot as plt
x = ['A', 'B', 'C'] # x轴
height1 = [5, 20, 15]
height2 = [1, 12, 2]
# 堆叠柱状图 + 颜色映射
plt.figure(figsize=(10, 4)) # 设置画布大小,长为10,宽为4 单位英寸
plt.bar(x, height1, color='g', edgecolor='black', label='1')
plt.bar(x, height2, bottom=height1, color='orange', edgecolor='black', label='2')
plt.legend() # 显示图例
plt.title('叠堆柱状图 + 颜色映射', fontfamily='SimHei')
plt.show()

六 plt.hist
--> 绘制直方图
1 函数语法
python
plt.hist(
x, # 输入数据(必需)
bins=10, # 柱子数量或边界(默认10)
range=None,# 数据范围(默认(min,max))
density=False, # 是否显示概率密度(默认False)
color=None, # 柱子颜色
edgecolor='none', # 边框颜色(默认无边框)
alpha=1.0, # 透明度
align='mid', # 对齐方式('left','mid','right')
orientation='vertical' # 方向('vertical'或'horizontal')
)
2 代码示例
python
import numpy as np
import matplotlib.pyplot as plt
data = np.random.normal(0, 1, 1000) # 生成1000个正态分布随机数
plt.hist(data, bins=30, color='skyblue', edgecolor='black', alpha=0.7)
plt.title('正态分布直方图', fontfamily='SimHei')
plt.xlabel('数值', fontfamily='SimHei')
plt.ylabel('频数', fontfamily='SimHei')
plt.show()

七 plt.pie
--> 绘制饼图
1 函数语法
python
plt.pie(
x, # 数据数组(必需)
labels=None, # 各扇区的标签
colors=None, # 自定义颜色列表
autopct=None, # 百分比显示格式
startangle=90, # 起始角度(默认12点钟方向)
shadow=False, # 是否添加阴影
explode=None, # 突出某些扇区
pctdistance=0.6, # 百分比标签距圆心距离
labeldistance=1.1, # 文本标签距圆心距离
wedgeprops=None, # 扇区属性(如边框)
textprops=None, # 文本属性(如字体大小)
center=(0, 0), # 圆心位置
radius=1, # 饼图半径
frame=False, # 是否显示外框
rotatelabels=False, # 旋转标签以适应扇区
)
2 参数说明
参数 | 类型 | 默认值 | 作用 | 示例值 | 注意事项 |
---|---|---|---|---|---|
x |
array | 必填 | 数据数组(决定各扇区大小) | [15, 30, 45] |
数据总和会自动归一化为100% |
labels |
list | None |
扇区的文本标签 | ['A', 'B', 'C'] |
1. 长度需与x 的长度保持一致 2. 空标签用'' 3. labels 参数必须是1个数组,每个楔形(扇形)都有一个标签(数组元素)与之对应 |
colors |
list | 循环色表 | 也可以自定义扇区颜色 | ['#ff9999', 'gold', 'lightblue'] |
1 支持颜色名、十六进制、RGB元组 2 如果指定了参数,则必须是一个数组,且长度与x的长度一致 |
autopct |
str | None |
百分比显示格式 | '%1.1f%%' (1位小数) |
需包含%% 表示百分号 |
startangle |
float | 90 |
起始角度(度) | 45 (从2点钟方向开始) |
0度=3点钟方向,逆时针旋转 |
shadow |
bool | False |
是否添加阴影 | True |
阴影方向固定为右下角 |
explode |
list | None |
突出扇区(偏移比例) | [0, 0.1, 0] |
1 长度需与x 一致 2 如果指定参数,则必须是数组,数组内容相当于楔形与圆心的距离 |
pctdistance |
float | 0.6 |
百分比标签位置 | 0.8 (靠近边缘) |
0.5=圆心,1.0=边缘 |
labeldistance |
float | 1.1 |
文本标签位置 | 1.3 (更远离圆心) |
可设为None 隐藏标签 |
wedgeprops |
dict | None |
扇区样式控制 | {'width':0.3, 'edgecolor':'black'} |
1width 控制环宽(甜甜圈图) 2 写1 和None 的效果一样,中间是没有洞的 |
textprops |
dict | None |
文本样式控制 | {'fontsize':12, 'color':'red'} |
影响标签和百分比文本 |
center |
tuple | (0,0) |
圆心坐标 | (0.5, 0.5) |
需配合radius 调整位置 |
radius |
float | 1 |
饼图半径 | 1.2 (放大) |
值越大图形越大 |
frame |
bool | False |
是否显示外框 | True |
框线颜色同坐标轴 |
rotatelabels |
bool | False |
旋转标签适应扇区 | True |
适合小角度扇区 |
plt.legend
同样可以设置图例
3 代码示例
示例中引入的库皆为:
python
import numpy as np
import matplotlib.pyplot as plt
示例中的x数组皆为:
python
x = np.array([10, 40, 50])
3.1 基础创建
python
plt.pie(x, labels=['A', 'B', 'C', 'D'])
plt.show()

2. 突出显示B+阴影
python
plt.pie(x, explode=[0, 0.1, 0, 0], shadow=True)
plt.show()

3. 环形饼图(甜甜圈图)
python
# 图1 --> 甜甜圈
plt.subplot(1, 3, 1)
plt.pie(x, labels=['A', 'B', 'C', 'D'], wedgeprops={'width': 0.5}) # width控制环宽
# 图2 --> 中间无洞
plt.subplot(1, 3, 2)
plt.pie(x, labels=['A', 'B', 'C', 'D'], wedgeprops=None)
# 图3 --> 中间无洞
plt.subplot(1, 3, 3)
plt.pie(x, labels=['A', 'B', 'C', 'D'], wedgeprops={'width': 1})
plt.show()
