当前位置: 首页 > news >正文

「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 pdxPoints = 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标记大小(默认 6markersize=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.5linewidth=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 pltx = 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颜色值文本背景色所有文本函数
alpha0-1之间的浮点数文本透明度所有文本函数
verticalalignment'top', 'center', 'bottom', 'baseline'文本垂直对齐方式text()/标题类函数
horizontalalignment'left', 'center', 'right'文本水平对齐方式所有文本函数
bbox字典文本边框样式,如 {'boxstyle':'round', 'facecolor':'yellow'}所有文本函数
usetexTrue/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) --> 默认为 Truewhich='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.5edgecolors='face' # 默认边框颜色同填充色
)

2 创建散点图

代码示例

import numpy as np
import matplotlib.pyplot as pltx = [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 pltx = ['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 pltdata = 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 参数说明

参数类型默认值作用示例值注意事项
xarray必填数据数组(决定各扇区大小)[15, 30, 45]数据总和会自动归一化为100%
labelslistNone扇区的文本标签['A', 'B', 'C']1. 长度需与x的长度保持一致
2. 空标签用''
3. labels参数必须是1个数组,每个楔形(扇形)都有一个标签(数组元素)与之对应
colorslist循环色表也可以自定义扇区颜色['#ff9999', 'gold', 'lightblue']1 支持颜色名、十六进制、RGB元组
2 如果指定了参数,则必须是一个数组,且长度与x的长度一致
autopctstrNone百分比显示格式'%1.1f%%'(1位小数)需包含%%表示百分号
startanglefloat90起始角度(度)45(从2点钟方向开始)0度=3点钟方向,逆时针旋转
shadowboolFalse是否添加阴影True阴影方向固定为右下角
explodelistNone突出扇区(偏移比例)[0, 0.1, 0]1 长度需与x一致
2 如果指定参数,则必须是数组,数组内容相当于楔形与圆心的距离
pctdistancefloat0.6百分比标签位置0.8(靠近边缘)0.5=圆心,1.0=边缘
labeldistancefloat1.1文本标签位置1.3(更远离圆心)可设为None隐藏标签
wedgepropsdictNone扇区样式控制{'width':0.3, 'edgecolor':'black'}1width控制环宽(甜甜圈图)
2 写1None的效果一样,中间是没有洞的
textpropsdictNone文本样式控制{'fontsize':12, 'color':'red'}影响标签和百分比文本
centertuple(0,0)圆心坐标(0.5, 0.5)需配合radius调整位置
radiusfloat1饼图半径1.2(放大)值越大图形越大
frameboolFalse是否显示外框True框线颜色同坐标轴
rotatelabelsboolFalse旋转标签适应扇区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()

在这里插入图片描述

相关文章:

  • 数据库相关操作
  • YOLOv11改进 | Conv/卷积篇 | 2024最新ECCV最新大感受野的小波卷积WTConv助力YOLOv11有效涨点(二次创新C3k2)
  • XXX2024073105:纪念品分组【c++】
  • 关于layui select option莫名多一行的问题
  • NodeJS哪些情况下会造成内存泄漏和避免方法
  • 建造者模式Builder Pattern
  • LeetCode HOT 100
  • ShenNiusModularity项目源码学习(34:总结)
  • 每日学习一道数模题-2024国赛E题-交通流量管控
  • React19源码系列之Hooks(useState)
  • C++ 类的知识点
  • 【Docker 05】Container - 容器
  • Spring AI的ChatClient和ChatModel接口
  • Node.js 中的 Token 认证机制详解
  • 动态规划之斐波那契数(一)
  • java 集合 泛型
  • (LeetCode 每日一题) 1432. 改变一个整数能得到的最大差值(贪心)
  • 编译链接实战(30)strip移除了哪些内容
  • JVM 类加载过程/对象创建过程/双亲委派机制/垃圾回收机制
  • 大模型微调(Fine-tuning)概览
  • 网站开发时数据库的工作/安卓优化大师手机版下载
  • 加强门户网站建设与管理办法/网站关键词优化推广
  • 如何做网站的教程/优化教程网站推广排名
  • WordPress建立电商网站/seo怎么做优化
  • 中央人民政府门户网站建设理念/内容营销的4个主要方式
  • 怎么做自己的手机网站/开封seo推广