「Matplotlib 入门指南」 Python 数据可视化分析【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 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 单独控制标记透明与线条透明)
    • [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 区别)
    • [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 优先级 和 区别

属性 参数名(缩写) 作用对象 默认 优先级
线条颜色 colorc 连接数据点的线 继承自全局样式或默认色 最低
标记内部颜色 markerfacecolormfc 数据点标记的填充色 默认与线条颜色相同 中等
标记边框颜色 markeredgecolormec 数据点标记的边框色 默认与线条颜色相同 最高

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值实现

    python 复制代码
    plt.plot(x, y, marker='o', color='r', mfc=(1, 1, 0, 0.5))  # 黄色标记50%透明
  • 仅线条透明

    python 复制代码
    plt.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 设置点的颜色(新知识:颜色映射)

注意:

  • 如果同时指定 ccolorc 参数优先级更高
  • 使用 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 颜色名称/缩写

代码示例

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-1001自动归一为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 基础颜色

  • 单柱统一颜色

    python 复制代码
    plt.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)
  • 多柱不同颜色

    python 复制代码
    colors = ['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 写1None的效果一样,中间是没有洞的
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()
相关推荐
Johny_Zhao4 小时前
CentOS Stream 8 高可用 Kuboard 部署方案
linux·网络·python·网络安全·docker·信息安全·kubernetes·云计算·shell·yum源·系统运维·kuboard
站大爷IP4 小时前
精通einsum():多维数组操作的瑞士军刀
python
站大爷IP5 小时前
Python与MongoDB的亲密接触:从入门到实战的代码指南
python
Roc-xb6 小时前
/etc/profile.d/conda.sh: No such file or directory : numeric argument required
python·ubuntu·conda
世由心生7 小时前
[从0到1]环境准备--anaconda与pycharm的安装
ide·python·pycharm
猛犸MAMMOTH8 小时前
Python打卡第54天
pytorch·python·深度学习
梓羽玩Python8 小时前
12K+ Star的离线语音神器!50MB模型秒杀云端API,隐私零成本,20+语种支持!
人工智能·python·github
成都犀牛8 小时前
LangGraph 深度学习笔记:构建真实世界的智能代理
人工智能·pytorch·笔记·python·深度学习
終不似少年遊*8 小时前
【数据可视化】Pyecharts-家乡地图
python·信息可视化·数据挖掘·数据分析·数据可视化·pyecharts