「Matplotlib数据可视化入门指南:Python数据分析全攻略,涵盖爬虫、数据处理、可视化与报告生成」

– 第 107 篇 –
Date: 2025 – 06 – 15
Author: 郑龙浩(仟墨)

Matplotlib – 数据可视化分析

文章目录

  • Matplotlib – 数据可视化分析
  • 一 Matplotlib 基础
  • 1 介绍
  • 2 matplotlib的安装
  • 3 matplotlib 的 pyplot 引用
  • 4 打印可视化图形
  • 二 `plt.plot()` –> 绘制图像:折线图
  • 1 绘制线条
  • 1.1 绘制 x 和 y点
  • 1.2 两个点绘制 –> 1条直线
  • 绘制两条线
  • 1.3 只绘制两个点 –> 无线条
  • 1.4 多个点绘制 –> 折线
  • 1.5 自动匹配x轴的点
  • 2 点标记(marker)
  • 3 线型(linestyle)
  • 4 颜色(`'color'/'c'、'markeredgecolor'/'mec'、'markerfacecolor'/'mfc'`)
  • 4.1 **基本颜色**
  • 4.2 优先级 和 区别
  • 4.3 填充线条颜色
  • 4.4 标记内部颜色、标记边框颜色
  • 5 标记大小(Markersize)
  • 6 线宽/线粗(Linewidth)
  • 7 不透明度(Alpha)
  • 7.1 `alpha`参数
  • 7.2 单独控制标记透明与线条透明
  • 8 标签
  • 8.1 如果无法显示中文
  • 8.2 标签的作用
  • 8.3 绘图标题、x轴标签、y轴标签
  • 8.4 设置标题、标签的字体属性
  • 8.4.1 直接传参
  • 8.4.2 使用字典
  • 8.5 设置标题位置
  • 8.6 所有参数
  • 9 网格
  • 9.1 添加网格
  • 9.3 设置网格属性
  • 三 `plt.subplot()` –> 创建多个子图
  • 1 介绍
  • 2 函数语法 + 使用方法
  • 3 实操
  • 四 `plt.scatter()` –> 绘制散点图
  • 1 函数语法
  • 2 创建散点图
  • 3 点标记、点大小、透明度
  • 4 设置点的颜色(新知识:颜色映射)
  • 4.1 默认颜色 –> 当不指定时,默认颜色
  • **手动指定颜色:**
  • 4.2 颜色名称/缩写
  • 4.3 十六进制颜色码
  • 4.4 RGB/RGBA元组
  • 4.5 灰度值
  • 4.6 颜色映射(数值 –> 颜色)
  • 4.6.1 基础用法
  • 4.6.2 控制数值范围
  • 4.6.3常用色表
  • 4.6.4 自动归一化机制​​
  • 4.7 为每个点单独指定颜色
  • 5 示例
  • 五 `plt.bar() / plt.barh()` –> 绘制柱状图
  • 1 函数语法
  • 1.1 `plt.bar()`
  • 1.2 `plt.barh()`
  • 1.3 区别
  • 2 设置颜色
  • 2.1 基础颜色
  • 2.2 颜色映射(数值→颜色)
  • 3 堆叠柱状图
  • 4 分组柱状图
  • 5 分组 + 颜色映射 示例
  • 六 `plt.hist` –> 绘制直方图
  • 1 函数语法
  • 2 代码示例
  • 七 `plt.pie` –> 绘制饼图
  • 1 函数语法
  • 2 参数说明
  • 3 代码示例
  • 3.1 基础创建
  • 2. **突出显示B+阴影**
  • 3. **环形饼图(甜甜圈图)**
  • 一 Matplotlib 基础

    1 介绍

    Matplotlib是Python最常用的绘图库,用于创建静态、交互式和动态可视化

    2 matplotlib的安装

  • 在终端输入pip install matplotlib安装库

  • 如果出现 Successfully installed contourpy-1.3.2......之类的字样表示安装成功

    如果出现Requirement already satisfied之类的字样则表示已经安装过了

  • 3 matplotlib 的 pyplot 引用

    大部分使用的程序都是 pyplot 子模块下的,所以通常直接引用 pyplot

    import matplotlib.pyplot as plt
    

    4 打印可视化图形

    打印图形的时候,用 print 函数是打印不出来的,必须使用plt.show
    使用方法如下:

    import matplotlib.pyplot as plt
    plt.show()
    

    plt.plot() –> 绘制图像:折线图

    1 绘制线条

    1.1 绘制 x 和 y点

  • 用于在图标中绘制点(标记)
  • 默认情况下plot()函数是点到点绘制一条线
    参数1是一个包含x轴上的点的数组
    参数2是一个包含y轴上的点的数组
  • 1.2 两个点绘制 –> 1条直线

    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()打印,如下:

    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 只绘制两个点 –> 无线条

    只绘制起点终点两个点

    plt.plot(xPoints, yPoints2, 'o')
    plt.show()
    

    效果
    无线

    1.4 多个点绘制 –> 折线

    其中,两个人参数中的数组元素数量必须保持一致
    如果第一个数组3个元素,第二个数组5个元素,不匹配的话会报错

    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

    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='|'
    '_' 水平线(─) marker='_'
    'P' 填充加号(🞣) marker='P'
    'X' 填充叉号(🞨) marker='X'
    '$...$' LaTeX 符号(如 '$\u2665$' 显示❤️) marker='$\u2665$'

    查看所有标记

    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'

    简写 –> 线型可以和颜色写到一起

    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 填充线条颜色

    代码示例

    # 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 标记内部颜色、标记边框颜色

    如下所示,

  • 如果不指定标记内部颜色、标记边框颜色,则全都默认为“线条颜色”
  • 如果不指定标记内部颜色,则标记内部颜色默认为“线条颜色”
  • 如果不指定标记边框颜色,则标记边框颜色默认为“线条颜色”
  • 代码示例

    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

    示例代码

    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

    示例代码

    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(完全不透明)

    添加不透明度

    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值实现
    plt.plot(x, y, marker='o', color='r', mfc=(1, 1, 0, 0.5))  # 黄色标记50%透明
    
  • 仅线条透明
    plt.plot(x, y, marker='o', color=(1, 0, 0, 0.3), mfc='y')  # 红色线条30%透明
    
  • 代码

    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)。这些字体不包含中文字符集,遇到中文时会自动回退到空白或方框(□)

    标签中写中文的时候,可能无法正常显示,比如中文显示为方框(□)或乱码
    想要解决的话,可以手动设置字体

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 默认字体--黑体
    

    8.2 标签的作用

  • x轴​​:表示什么数据(如时间、距离、类别)
  • ​​y轴​​:表示什么数据(如温度、销量、频率)
  • ​​标题​​:图表的核心主题
  • 8.3 绘图标题、x轴标签、y轴标签

    可以为绘图设置标签,也可以给x和y轴设置标签

    代码示例

    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 直接传参

    实现代码

    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 使用字典

    当然也可以用字典,个人感觉这样写看起来比较整洁简单

    实现代码

    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靠左,靠右,居中(默认居中)

    实现代码

    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' 可以省略

    import numpy as np
    import matplotlib.pyplot as plt
    y = np.array([1, 10])
    plt.plot(y)
    plt.grid(axis='both'o) # 显示全部 
    plt.show() # 全部显示
    

    ② 仅纵向

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

    ③ 仅横向

    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 设置网格属性

    函数语法

    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不透明)
    )
    

    线型、颜色、线宽、透明度和前面那些函数的用法相同

    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 函数语法 + 使用方法

    说白了,三个参数意思就是: 总共有几行,几列,当前图的位置(横着数,数到头就换行)

    plt.subplot(
    	nrows,  # 子图网格的行数
    	ncols,  # 子图网格的列数
    	index   # 当前子图的位置(从1开始编号)
    )
    
  • nrows:子图网格的行数
  • ncols:子图网格的列数
  • index:当前子图的位置(从1开始,按行优先编号)
  • 还可以给子图加标题
    也可以给总图加标题 – > 使用超级标题

    plt.suptitle('超级标题')
    

    3 实操

    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 函数语法

    函数语法

    plt.scatter(
        x, y,  # 数据点坐标(必需)
        s=36,  # 点大小(默认36,即6x6像素)
        c='#1f77b4', # 默蓝色
        marker='o', # 默认圆圈
        alpha=1.0, # 默认不透明
        linewidths=1.5, # 默认边框宽度1.5
        edgecolors='face' # 默认边框颜色同填充色
    )
    

    2 创建散点图

    代码示例

    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 颜色名称/缩写

  • 基础色:'r', 'g', 'b', 'c', 'm', 'y', 'k', 'w'
  • 所有合法颜色名
  • 代码示例

    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 十六进制颜色码

    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), ...]

    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 灰度值

    也可以设置灰度值,不止是纯颜色

    plt.scatter(x, y, c='0.5') # 50%灰(字符串格式,字符串也是小数的形式)
    plt.show()
    

    灰度数值

    4.6 颜色映射(数值 –> 颜色)

    顾名思义,就是数值映射为颜色

    4.6.1 基础用法
    values = np.random.rand(20)  # 生成范围数量为20,数字在0-1之间的随机数
    plt.scatter(x, y, c=values, cmap='viridis') # 生成随机颜色的散点图
    plt.colorbar()  # 显示颜色条
    plt.show()
    


    颜色条的范围也并非是0~1,这个取决于数值范围,比如数值改成1-100之间的数值:

    values2 = np.random.randint(1, 101, size=20) 
    plt.scatter(x, y, c=values2, cmap='viridis') # 生成随机颜色的散点图
    plt.colorbar()  # 显示颜色条
    plt.show()
    

    4.6.2 控制数值范围
    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 都会通过以下公式自动归一化:
  • 归一化值 = (当前值 - vmin) / (vmax - vmin)
    
  • ​​默认行为​​:不指定 vmin/vmax 时,系统默认用指定数据的 ​​最小值​​ 和 ​​最大值​​ 作为范围,如下举例:
    最小值为50,最大值为200,所以就算不指定,也是默认为 vmin=50, vmax=200
  • 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 为每个点单独指定颜色

    # 每个点不同颜色(数组长度需与数据一致)
    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 示例

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

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

    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 基础颜色

  • 单柱统一颜色

    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)
    
  • 多柱不同颜色

    colors = ['red', 'green', 'blue']
    plt.bar(x, height, color=colors)  # 颜色列表长度需与数据一致
    
  • 2.2 颜色映射(数值→颜色)

    适用场景:根据数值大小自动分配颜色(如热力图效果)

    values = np.random.rand(10)  # 生成0~1的随机值
    plt.bar(x, height, color=plt.cm.viridis(values))  # 使用viridis色映射
    plt.colorbar()  # 显示颜色条
    

    3 堆叠柱状图

    通过 bottom(垂直)或 left(水平)参数实现:
    也就是说,在画第二个图的时候,从上一个图的顶部为起始

    # 垂直堆叠
    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 实现分组:

    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 分组 + 颜色映射 示例

    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 函数语法

    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 代码示例

    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 函数语法

    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 代码示例

    示例中引入的库皆为:

    import numpy as np
    import matplotlib.pyplot as plt
    

    示例中的x数组皆为:

    x = np.array([10, 40, 50])
    

    3.1 基础创建

    plt.pie(x, labels=['A', 'B', 'C', 'D'])
    plt.show()
    

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

    3. 环形饼图(甜甜圈图)
    # 图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()
    

    作者:仟墨

    物联沃分享整理
    物联沃-IOTWORD物联网 » 「Matplotlib数据可视化入门指南:Python数据分析全攻略,涵盖爬虫、数据处理、可视化与报告生成」

    发表回复